ImN*_*oob 1 c gcc initialization segmentation-fault
我有这个看起来像的程序.
int indexLength;
char *args[1024];
while(args[indexLength])
indexLength++;
Run Code Online (Sandbox Code Playgroud)
如果我在计算机上运行程序,while循环行给了我一个段错误...而indexLength取一些荒谬的任意值.但是,如果我在家里的Linux机器上运行程序,没有段错误,我的程序正常运行.
我可以想到的两台机器之间的唯一区别是,工作中的那个有gcc4.7 redhat版本,并且正在运行Fedora OS,而我家的机器已经从ppa存储库下载了gcc4.7,并且正在运行ubuntu OS.但是,我不相信这是唯一的区别!它能是什么?
编辑:抱歉,我忘了提.如果我初始化indexLength = 0,则segfault在工作的计算机上消失了.
从未初始化的内存中读取是未定义的行为.默认情况下不会初始化变量,因此indexLength在分配变量之前可以使用任何值.由于行为未定义,程序可能在某些计算机上运行,而在其他计算机上崩溃.
此外,即使初始化indexLength为零也不会修复未定义的行为,因为args仍然未初始化.这意味着程序在到达数组末尾时可能不会停止,并且访问超过分配区域末尾的值.当然,为了做到这一点,1024个项目的数组中的所有值必须为非零,因此在到达数组末尾之前,有利于停止.但是,为了修复此未定义的行为,您需要在访问值之前检查索引.