免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1868 | 回复: 9
打印 上一主题 下一主题

c专家编程中的问题请教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-28 08:53 |只看该作者 |倒序浏览
在 c专家编程书中48页,有端程序/* 将源文件的timestamp转换为表示当地格式日期的字符串*/
char *localized_time(char *filename)
{
        struct tm *tm_ptr;
        struct stat stat_block;
        char buffer[120];
       
        /*获得源文件的timestamp,格式为 time_t*/
         stat(file,&stat_block);
         
         /*把unix 的time_t转换为tm结构,里边保存当地时间*/
         tm_ptr=localtime(&stat_block,st_time)
         
         /*把tm结构转换成以当地时间*/
         strftime(buffer,sizeof(buffer),"%a %b %e %T %Y",tm_ptr);
         
         return buffer;
        }
         
书上说return buffer这行错误,  buffer是一个自动分配内存的数组,是该函数的局部变量。控制流离开声明自动变量的范围时,自动变量便自动失效。
但是我们调用一个函数,都要先声明的啊,那就意味着这个程序没有问题啊!
比如一个简单例子:
int add(int a,int b) {
        int c;
        c=a+b;
        return c;
}


#include<stdio.h>
int add(int a,int b);
int main(void)  {
        int a,b,d;
        a=1;
        b=2;
    d=add(a,b);
        printf("%d\n",d);
}
这样绝对可以得到返回值的。
大家把我分析下这个问题原因啊,

论坛徽章:
0
2 [报告]
发表于 2008-10-28 09:14 |只看该作者
你用int当然是没问题。。。因为你已经得到了传回去的值

而传指针就不一样了,你确实得到了返回的指针(一个地址),可是这个指针所指向的内存已经被释放了,如果你现在操作那块内存,会有未知的错误

论坛徽章:
0
3 [报告]
发表于 2008-10-28 09:25 |只看该作者
那句话事针对指针变量的。

走出函数后,指针指向的内存空间已经被释放了。你再去引用就得不到正确的值了。

论坛徽章:
0
4 [报告]
发表于 2008-10-28 10:27 |只看该作者
建议再研究下值传递和指针传递那一块儿

论坛徽章:
0
5 [报告]
发表于 2008-10-28 10:55 |只看该作者
你自己的例子是返回的数值,c专家编程书中48页里面是返回的地址。
不错,你是可以得到返回的地址.
但当返回是地址的时候,地址里的内容已经被释放掉了。但你仍然引用这个返回,读取地址里的数据,当然会有问题。

论坛徽章:
0
6 [报告]
发表于 2008-10-28 11:17 |只看该作者
返回的是个指针,而指针所指向的内存已经释放

论坛徽章:
0
7 [报告]
发表于 2008-10-28 15:22 |只看该作者
如果是局部变量,则return能够安全返回的是数据类型对象。
例如,int a;char b;struct c;
这里的a,b,c都能安全返回

论坛徽章:
0
8 [报告]
发表于 2008-10-28 16:43 |只看该作者

回复 #1 ironbridge 的帖子

返回自动变量时,如果返回的是值,则不会有问题。你说的情况是返回的地址,函数返回时对应地址已经被释放了,所以才会有问题。

论坛徽章:
0
9 [报告]
发表于 2008-10-28 22:33 |只看该作者
哈哈, 楼主功力善缺, 明显声明的是栈的内容, 还传递指针回去, 函数调用完了, 栈的内容都找不到了~~~ 嘿, 用句话说就是, 你空手套白狼, 转手了又想找回他, 哎, 那不是不可能的嘛~ 泼出去的水是收不回的

论坛徽章:
0
10 [报告]
发表于 2008-10-29 00:08 |只看该作者
char *localized_time(char *filename,char *ret)
最后是在参数里面添加一个用于返回的指针,然后函数里面用
ret=strdup(buffer);
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP