C奇怪的int数组指针

时间:2014-06-14 17:42:30

标签: c pointers malloc

int *array; //it allocate a pointer to an int right?
    array=malloc(sizeof(int); //allocate the space for ONE int right?
    scanf("%d", &array[4]);  //must generate a segmentation fault cause there is not allocated space enough right?
    printf("%d",array[4]); //it shouldn't print nothing...

但它打印4!为什么呢?

3 个答案:

答案 0 :(得分:2)

在C中读取或写出数组的结尾会导致未定义的行为,这意味着绝对会发生任何事情。它可能会使程序崩溃,或格式化硬盘驱动器,或者使计算机着火。在你的情况下,恰好是这样的情况很好,可能是因为malloc填充分配的内存的长度是出于效率的原因(或者可能是因为你正在捣毁内存{{1}我想稍后使用)。然而,这根本不是便携式的,不能保证工作,并且等待发生灾难。

希望这有帮助!

答案 1 :(得分:0)

因为操作系统碰巧有你要求的内存。此代码绝不保证在另一台机器或其他时间运行。

答案 2 :(得分:0)

C不检查代码是否获取数组大小的边界,这取决于程序员。我猜你可以把它称为未定义的行为(虽然它们并不完全是他们所说的未定义的行为,因为大多数内存将位于堆栈的一部分或堆中,所以你仍然可以使用它。 当你说array[4]时你实际上说*(array + 4)当然后来被翻译为*(array + 4*sizeof(int))并且你实际上去了记忆中的某个空间,空间存在,它可能是read-only {1}},也许是程序中另一个数组或变量的位置,或者它可能完美无缺。不保证它会是一个错误,但它不是什么未定义的行为。 要了解有关未定义行为的更多信息,您可以转到this article(我觉得非常有趣)。