当前位置: 技术问答>linux和unix
fopen奇怪问题
来源: 互联网 发布时间:2015-10-02
本文导语: linux7.2.一fopen就内存错误。gdb可以定位到哪个变量内存错误吗? 错误如下: 886 sprintf(tmpname,"%s%s",path,fname); (gdb) n 888 ...
linux7.2.一fopen就内存错误。gdb可以定位到哪个变量内存错误吗?
错误如下:
886 sprintf(tmpname,"%s%s",path,fname);
(gdb) n
888 printf("temp name= %sn",tmpname);
(gdb) n
temp name= /usr/lic3g/data/pas3g/1/6/0/0/8614101110061/http/message.real.com/Msg/7.0/win32
889 fp=NULL;
(gdb) n
890 fp=fopen(tmpname,"a");
(gdb) n
Program received signal SIGSEGV, Segmentation fault.
0x4207abfd in free () from /lib/i686/libc.so.6
大家觉得是什么错误?我觉得是open的时候和某个变量内存冲突了。或者某个变量早就越界当fopen的时候就出问题了。问题是 能用gdb定位到哪个变量出错马?
错误如下:
886 sprintf(tmpname,"%s%s",path,fname);
(gdb) n
888 printf("temp name= %sn",tmpname);
(gdb) n
temp name= /usr/lic3g/data/pas3g/1/6/0/0/8614101110061/http/message.real.com/Msg/7.0/win32
889 fp=NULL;
(gdb) n
890 fp=fopen(tmpname,"a");
(gdb) n
Program received signal SIGSEGV, Segmentation fault.
0x4207abfd in free () from /lib/i686/libc.so.6
大家觉得是什么错误?我觉得是open的时候和某个变量内存冲突了。或者某个变量早就越界当fopen的时候就出问题了。问题是 能用gdb定位到哪个变量出错马?
|
你的tmpname应该是char *型的吧,fopen使用应该是没有问题的,你看一下你要打开的文件你有没有append 的权限。
另外,sprintf的使用有问题,sprintf的第一个参数应该是一个分配了的内存空间,而不应该是一个指向常量字符串的指针。这里你想向一个打开的文件输入内容应该用fprintf(FILE *stream,const char *format,...).
而接下来又使用printf又让人不明白了,他只能用于输出字符串
另外,sprintf的使用有问题,sprintf的第一个参数应该是一个分配了的内存空间,而不应该是一个指向常量字符串的指针。这里你想向一个打开的文件输入内容应该用fprintf(FILE *stream,const char *format,...).
而接下来又使用printf又让人不明白了,他只能用于输出字符串
|
这好像和编译器有关吧,VC编译器在Debug版本时,分配内存时,会在越界的地方加入越界标记,所以当数组越界时,马上抛出异常。但是release版本时把这个标记去掉了,所以越界时不能马上发现,
其他编译器道理一样,gcc可能就是没有加这种越界检查,所以越界时根本不知道,直道他非法访问了不允许访问的内存时才core dump,可是这时并不是第一现场,呵呵!所以越界问题比较难查。
是不是这个道理呢!?
其他编译器道理一样,gcc可能就是没有加这种越界检查,所以越界时根本不知道,直道他非法访问了不允许访问的内存时才core dump,可是这时并不是第一现场,呵呵!所以越界问题比较难查。
是不是这个道理呢!?