预期分段错误,只要为索引1分配值?

pfd*_*ers 2 c memory arrays memory-management segmentation-fault

在代码片段中,一旦尝试为其分配值,我就预料到了分段错误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;
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释发生了什么吗?

编辑的原因: 根据用户的评论改进了示例代码 int count[0] -> int count[1],也避免了火焰战争.

jal*_*alf 15

你的写作超出了数组的范围.这并不意味着你会遇到分段错误.它只是意味着你有未定义的行为.您的程序的行为不再受C标准的约束.任何事情都可能发生(包括程序似乎有效) - 段错误只是一种可能的结果.

实际上,当您尝试访问操作系统未映射到您的进程的内存页时,会发生分段错误.在典型的x86 PC上,每个页面都是4KB,因此基本上,您的进程可以访问4KB块的内存,如果您在当前块之外写入,则只会出现段错误.

使用您正在使用的小索引,您仍然保留在当前内存页面中,该页面分配给您的进程,因此CPU不会检测到您正在访问内存超出范围.