c - 预期的段错误,一旦为索引 1 赋值?

标签 c arrays memory 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;
}

谁能解释一下发生了什么?

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

最佳答案

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

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

使用您使用的小索引,您仍然停留在分配给您的进程的当前内存页面中,因此 CPU 不会检测到您正在越界访问内存。

关于c - 预期的段错误,一旦为索引 1 赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3076603/

相关文章:

ruby-on-rails - 在 Ubuntu 服务器上通过 ruby​​ 脚本启动 C 可执行文件

c++ - 将 C 类型字符串数组中的元素作为 BSTR 传递给 COM 对象? (在 C++ 中)

memory - 解码从ARM内存转储的数据的问题

android - 带按钮内存的定制适配器

c - 用于 openGL 的 DIY 相机变换

c - malloc 无法分配内存 + 不发出警告

java - 动态添加对象到数组

PHP 检查 $_POST

c# - 如何迭代多维数组的行和列?

c++ - 分析 stable_sort