首页 > 解决方案 > 程序应该崩溃,但它没有

问题描述

#include <stdio.h>
#define CHAR_ROW_SIZE 4
int charTable[CHAR_ROW_SIZE ][2] = {
  {'X', 'Z'},
  {'J', 'L'},
  {'F', 'C'},
  {'A', 'B'}
};

int main()
{
    printf("char element %c\n", charTable[3][1]); //fine
    printf("char element %c\n", charTable[3][8]); // accessing 4th row's 9th element which is not valid 
    printf("char element %c\n", charTable[85][0]);// accessing 86th row's first element which is not valid 

    return 0;
}

输出:

char element B                                                                                                                                                                     
char element                                                                                                                                                                       
char element

据我了解,C\C++ 实际上并没有对数组进行任何边界检查。这取决于操作系统来确保您访问的是有效内存。所以这是未定义的行为。

但是在这里我可以看到在不同的机器上不断的相同行为。即程序不会随时崩溃。

标签: arrayscmemoryundefined-behavior

解决方案


但是在这里我可以看到在不同的机器上不断的相同行为。即程序不会随时崩溃。

在这里,崩溃(或分段错误)既不是期望的也不是保证的行为,行为是undefined

这里的底线是,访问越界内存(即,不属于您的进程地址空间的内存位置)是未定义的行为。有时带有 UB 的代码似乎工作得很好,没有任何分段错误,产生一些随机值,包括 0,造成事情“工作正常”的错觉,但事实并非如此!


推荐阅读