我有一个c程序,看起来像。

int indexLength;
char *args[1024];
while(args[indexLength])
     indexLength++;

如果我在工作时在计算机下运行程序,while循环线会给我一个segfault..而indexleng会取一些荒谬的任意值。
但如果我在家里的linux机器上运行这个程序,就没有segfault,我的程序也能正常运行。
我能想到的两台机器之间的唯一区别是工作中的那台有gcc4.7redhat版本,运行的是Fedora操作系统,我家的机器有从ppa存储库下载的gcc4.7,运行的是ubuntu操作系统。
但是,我不相信这是唯一的区别会是什么?
编辑:对不起,我忘了提如果我初始化indexleng=0,工作时计算机上的segfault就会消失。。

最佳答案

从未初始化的内存中读取是未定义的行为默认情况下,变量不会初始化,因此indexLength可以接受任何值,直到您指定它为止由于行为未定义,程序可能在某些计算机上运行,而在其他计算机上崩溃。
此外,即使将indexLength初始化为零也无法修复未定义的行为,因为args仍处于未初始化状态。这意味着程序在到达数组末尾时可能不会停止,并且访问的值超过了分配区域的末尾当然,为了做到这一点,1024个项目数组中的所有值都必须是非零的,所以在到达数组末尾之前,最好先停止但是,为了修复这种未定义的行为,您需要在访问值之前检查索引。

09-25 22:14