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] ,
也避免火焰 war 。

最佳答案

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

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

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

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

相关文章:

iphone - cocos2d 使用大量内存

c - 我这样做对吗? -C代码

c - 从目录中读取多个文件?

c - int 变量在语句的结果中声明为 double 后如何变化?

c++ - 重复符号后如何可靠地使用dlsym?

javascript - 在JavaScript数组中查找最接近值的算法

c - 棋盘问题

c++ - 如何创建通用动态数组?

c++ - 如何检查阵列更新

python - 强行丢弃 Python Imaging Library 图像以回收内存