在代码片段中,我预计在尝试为 count[1]
赋值时会出现段错误。然而,代码继续并执行第二个 for 循环,仅在程序终止时指示段错误。
#include <stdio.h>
int main()
{
int count[1];
int i;
for(i = 0; i < 100; i++)
{
count[i] = i;
}
for(i = 0; i < 100; i++)
{
printf("%d\n", count[i]);
}
return 0;
}
谁能解释一下发生了什么?
编辑原因:
根据用户的评论改进了示例代码,
int count[0] -> int count[1]
,
也要避免口水战。
最佳答案
你写的超出了数组的范围。这并不意味着您会遇到段错误。这只是意味着您有未定义的行为。您的程序的行为不再受 C 标准的约束。任何事情都可能发生(包括程序似乎可以正常工作)——段错误只是一种可能的结果。
实际上,当您尝试访问操作系统未映射到您的进程的内存页面时,会发生段错误。在典型的 x86 PC 上,每个页面都是 4KB,所以基本上,您的进程可以访问 4KB block 中的内存,如果您在当前 block 之外写入,您只会遇到段错误。
使用您使用的小索引,您仍然停留在分配给您的进程的当前内存页面中,因此 CPU 不会检测到您正在越界访问内存。
关于c - 预期的段错误,一旦为索引 1 赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3076603/