首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C编程段故障单一化的int?

C编程段故障单一化的int?
EN

Stack Overflow用户
提问于 2013-05-22 20:49:46
回答 2查看 100关注 0票数 1

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

代码语言:javascript
复制
int indexLength;
char *args[1024];
while(args[indexLength])
     indexLength++;

如果我在工作的计算机上运行程序,while循环行给了我一个segfault..and,indexLength取了一些可笑的任意值。但是,如果我在家里的linux机器上运行该程序,就不会出现段错误,并且我的程序可以正常运行。

我能想到的两台机器之间唯一的区别是,工作的那台机器是gcc4.7 redhat版本,运行的是Fedora OS,而我家的机器是从ppa存储库下载的gcc4.7,运行的是ubuntu操作系统。但是,我不相信这是唯一的区别!那会是什么呢?

编辑:对不起,我忘了提了。如果我初始化indexLength =0,那么工作中的计算机上的段故障就消失了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-22 20:52:18

从未初始化的内存中读取是未定义的行为。默认情况下,变量不会初始化,因此indexLength可以接受任何值,直到您为其赋值。由于行为未定义,程序可能会在某些机器上运行,而在其他机器上崩溃。

此外,即使将indexLength初始化为0也不能修复未定义的行为,因为args仍未初始化。这意味着程序可能不会在到达数组末尾时停止,并访问超过分配区域末尾的值。当然,为了做到这一点,1024个项的数组中的所有值都必须是非零的,所以在到达数组末尾之前停止的可能性是很大的。但是,为了修复这种未定义的行为,您需要在访问值之前检查索引。

票数 5
EN

Stack Overflow用户

发布于 2013-05-22 20:52:25

您的代码调用了未定义的行为

  • args未初始化,因此每个元素都包含不可预知的值。也许你会在下一个4k的堆栈中找到一个空指针并退出循环;也许你不会,你会在array
  • indexLength结束后读取,所以你可能会在数组结束后读取immediately
  • the,超出args的读取效果也是不可预测的。这包括潜在的崩溃,例如,如果在达到process

的可读内存限制之前没有找到一个零字

尽管最初的外观,设置indexLength=0实际上并没有使您的代码安全。您仍在读取未初始化的内存,因此依赖于在args中查找空元素。没有办法保证你会找到它。如果你的循环在数组末尾之前没有退出,你又回到了未定义的行为,所以你的程序可能会在任何进一步的迭代中崩溃。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16692242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档