【发布时间】:2014-06-28 22:26:25
【问题描述】:
我正在研究这个简单的程序。我的理解是,尝试修改超过最大索引的内存地址的值应该会导致分段错误。但是,以下代码运行没有任何问题。我什至可以打印出所有 6 个数组索引 0->6
main()
{
int i;
int a[3];
for(i=0; i<6; i++)
a[i] = i;
}
但是,当我将 for 循环更改为
for(i=0; i<7; i++)
并执行程序,它会出现段错误。 在我看来,这几乎就像是 malloc 完成的某种额外填充。 为什么这种情况只发生在在第 6 个索引 (s+6) 之后?这种行为会发生在更长/更短的数组中吗?请原谅我作为低级 java 程序员的愚蠢:)
【问题讨论】:
-
这是什么环境?例如 - 在 MSVC Debug 构建中,为每个分配的块进行了大量填充以检测内存访问违规。在您的特定情况下,可能只是系统可分配的 minimal 内存量恰好是
sizeof(int)*6 -
在访问数组外的内存时看到的任何行为都是未定义的行为/不可靠的。它很可能会在下一次运行时崩溃,或者可靠地工作数年,直到那个非常糟糕的崩溃时间。
-
通过汇编运行您的代码并阅读编译器生成的内容 - 这应该为您提供一些很好的见解,了解为什么它会以这种方式工作
标签: c arrays segmentation-fault