为什么不存在的数组位置允许编译

时间:2014-10-14 03:18:23

标签: arrays indexoutofboundsexception

#include <stdlib.h>
#include <stdio.h>
#include <ctime>      // For time functions
#include <math.h>     // For pow()
#include <iostream>
using namespace std;

int main()
{

      int jiff=50;
      int sizes[jiff]; //array of size jiff

    sizes[49]=50;  //existing, should be last position
    sizes[55]=4;    //should not exist

    printf("it is %d\n", sizes[49]);
    printf("it is %d",sizes[55]);
}

输出:

it is 50
it is 4

为什么我的代码没有崩溃? sizes [55]应该超出范围,并且应该在运行时崩溃。是什么给了什么?

编辑:没关系,它现在有时会崩溃,或者它会打印出模糊不清的大数字。我的新问题:为什么之前没有行为不端?我的前5次运行对于任何阵列位置都是完美的,直到60

2 个答案:

答案 0 :(得分:1)

访问未分配给您的内存会导致未定义的行为。有时,它可能会打印出位于该内存地址的任何内容,有时它可能会给您一个分段错误。有关常见未定义行为的列表,请参阅this question

答案 1 :(得分:1)

你是正确的,它是出界的,但它不一定会崩溃(虽然这是一个明显的可能性)。
当你执行sizes[55]=4;时,它会很乐意将4写入阵列末尾5个内存位置 但那是谁的记忆?它可能是您代码的另一部分,它代码是另一个应用程序的代码。如果它是另一个应用程序的代码,它可能会立即崩溃。如果它是您自己的代码,它可能会导致您的代码崩溃,并且很难调试与这段代码无关的方式。 请放心,即使它似乎没有引起问题,但它会在以后再次困扰你。