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!为什么呢?
答案 0 :(得分:2)
在C中读取或写出数组的结尾会导致未定义的行为,这意味着绝对会发生任何事情。它可能会使程序崩溃,或格式化硬盘驱动器,或者使计算机着火。在你的情况下,恰好是这样的情况很好,可能是因为malloc
填充分配的内存的长度是出于效率的原因(或者可能是因为你正在捣毁内存{{1}我想稍后使用)。然而,这根本不是便携式的,不能保证工作,并且等待发生灾难。
希望这有帮助!
答案 1 :(得分:0)
因为操作系统碰巧有你要求的内存。此代码绝不保证在另一台机器或其他时间运行。
答案 2 :(得分:0)
C不检查代码是否获取数组大小的边界,这取决于程序员。我猜你可以把它称为未定义的行为(虽然它们并不完全是他们所说的未定义的行为,因为大多数内存将位于堆栈的一部分或堆中,所以你仍然可以使用它。
当你说array[4]
时你实际上说*(array + 4)
当然后来被翻译为*(array + 4*sizeof(int))
并且你实际上去了记忆中的某个空间,空间存在,它可能是read-only
{1}},也许是程序中另一个数组或变量的位置,或者它可能完美无缺。不保证它会是一个错误,但它不是什么未定义的行为。
要了解有关未定义行为的更多信息,您可以转到this article(我觉得非常有趣)。