LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1205|回复: 5

fgets一例:我以为要段错误,可是却没有

[复制链接]
发表于 2005-10-31 10:34:27 | 显示全部楼层 |阅读模式

  1. #include <stdio.h>
  2. #include <sys/time.h>

  3. #define LB_SIZE 1024

  4. int main(int argc, char* argv[])
  5. {
  6.         char* lineBuf;
  7.         FILE* procFile = fopen( "/proc/sys/kernel/hostname", "r" );
  8.         fgets( lineBuf, LB_SIZE+1, procFile );
  9.         printf( "Machine hostname: %s", lineBuf );
  10.         fclose( procFile );
  11. }
复制代码

我以为会发生段错误,运行后却没有发生。

gdb结果:

  1. Breakpoint 1, main (argc=1, argv=0xbfffdf74) at prj1.c:10
  2. 10              fgets( lineBuf, LB_SIZE+1, procFile );
  3. (gdb) p /x lineBuf
  4. $3 = 0xbfffdf74
  5. (gdb) p /c *lineBuf
  6. $4 = 67 'C'
  7. (gdb) p /c *(lineBuf+1)
  8. $5 = -8 '?
  9. (gdb) p /c *(lineBuf+2)
  10. $6 = -1 '?'
复制代码


执行fgets( lineBuf, LB_SIZE+1, procFile ); 后

  1. (gdb) n
  2. 11              printf( "Machine hostname: %s", lineBuf );
  3. (gdb) p /x lineBuf
  4. $7 = 0xbfffdf74
  5. (gdb) p /c *lineBuf
  6. $8 = 99 'c'
  7. (gdb) p /c *(lineBuf+1)
  8. $9 = 104 'h'
  9. (gdb) p /c *(lineBuf+2)
  10. $10 = 111 'o'
  11. (gdb)
复制代码

lineBuf的值没有改变,可是它所指向的地址的值却按fgets改变了,仿佛执行了隐含的malloc.

GNU/Linux  kernel 2.4, gcc 3.2
发表于 2005-10-31 12:11:01 | 显示全部楼层
我试了一下,Segmentation fault了
回复 支持 反对

使用道具 举报

发表于 2005-10-31 12:20:59 | 显示全部楼层
lineBuf的值没有改变,可是它所指向的地址的值却按fgets改变了,仿佛执行了隐含的malloc.

这个仿佛从哪得出?
一个没有分配空间的指针,也肯定是指向内存中的一块区域,那么当这块区域是可写的时候,就不会出现问题,当它不可写的时候,就肯定会出现段错误。这跟malloc似乎没有多大的关系,除了malloc出来的肯定是可写的之外。
回复 支持 反对

使用道具 举报

发表于 2005-10-31 13:11:46 | 显示全部楼层
碰巧而已。
栈中的变量定义char* lineBuf; 不会被初始化成NULL,很可能是指定一个可以写入的内存页。
你试试写入更多的数据,肯定是有问题的。至于,内部自动调用了malloc,更是不可能,C还没高级到这个地步。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-31 14:17:13 | 显示全部楼层
Post by 弥敦路九号
碰巧而已。
栈中的变量定义char* lineBuf; 不会被初始化成NULL,很可能是指定一个可以写入的内存页。
你试试写入更多的数据,肯定是有问题的。至于,内部自动调用了malloc,更是不可能,C还没高级到这个地步。


我试了把指针初始化为NULL,果然段错误了。字体串指针的默认值可能是指向可写区域的吧。

默认值好像和语言没关系,要看OS和编译器。我记得Linux下gcc的空字符数组初始是全0,vc 6里的空字符数组就不是(好像是'烫',不知道是不是全1)
回复 支持 反对

使用道具 举报

发表于 2005-10-31 22:00:20 | 显示全部楼层
Post by Illidan
,vc 6里的空字符数组就不是(好像是'烫',不知道是不是全1)


不是1,而是 0xc
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表