首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

有一处不解,望大家解释上

2012-09-08 
有一处不解,望大家解释下C/C++ code#include stdio.h#include stdlib.hint mian (){char tmpname[L_tm

有一处不解,望大家解释下

C/C++ code
#include <stdio.h>#include <stdlib.h>int mian (){        char tmpname[L_tmpnam];        char *filename ;        FILE *tmpfp;        filename = tmpnam( tmpname );        printf( "%s\n" , filename );        tmpfp = tmpfile();        if(tmpfp)                printf("Opened a temporary file OK\n");        else                perror("tmpfile");        exit(0);}


这是《linux程序设计》上的一个例子
其中这一句
C/C++ code
char * filename ;

只是在栈上面声明一个filename,即指向了一个字符的指针,并没有在堆上开辟空间,也没有定义成一定长度的数组

C/C++ code
filename = tmpnam( tmpname );

返回的却是字符串,那么filename这个字符的后面的栈已经被写如了内容怎么办?或者写好了后被其他操作覆盖掉怎么办?

[解决办法]
以下个人理解:
tmpfile:返回char *,作用是产生一个唯一的文件名,创建一个临时文件,保存一些数据,以后再用,在程序退出时这些文件会自动删除。
filename = tmpnam( tmpname );产生的文件名存到tmpname和filename中,他们两个指向同一块内存。在程序结束时栈会销毁,临时文件也会自动删除。

[解决办法]
探讨

tmpnam()返回的是一串字符串的首地址
而在函数中,按如下返回首地址也不行,
C/C++ code

char * ddd()
{
char p[] = "dsadasdsada";
return p;
}


那么返回的字符串实际是保存在哪呢?

[解决办法]
有些不会销毁的吧,要看分配在栈上,还是堆上。比如 new过来的就不会销毁。
char s[] = "abc",这个会销毁。
char *s = "abc" ,这个不会,把s赋给filename是可行的

热点排行