为什么数组大于分配给它的内存?

时间:2014-02-07 13:46:39

标签: c

有人可以解释为什么这段代码有效,即使我只为st数组中的2个单元分配内存?

int main(void){

st=(int *)malloc(sizeof(int)*2);
int j;
for(j=0; j<5; j++){
    st[j]=j*10000;
}
}

虽然下一个代码不起作用......

int main(void){

st=(int *)malloc(sizeof(int)*2);
int j;
for(j=0; j<6; j++){
    st[j]=j*10000;
}
for(j=0; j<6; j++)
    printf("st[%d]=%d\n",j,st[j]);
}

据我所知,我不应该在st [j]中为j&gt; 1输入一个数字。

非常感谢!!!

3 个答案:

答案 0 :(得分:4)

访问未分配的内存是“未定义的行为”。这意味着程序可以以运行时错误退出,但它没有。

许多编译器在分配的内存周围构建带有某些保存的代码,以便在写入超出它时导致崩溃,但这些不必在任何条件下工作。在你的特殊情况下,似乎在数组边界上的12个字节不会触发它,但是会有16个字节。但这也是你不能也不应该依赖的东西。根据其他情况,另一个程序,与其他选项编译的相同程序,甚至在不同时间执行的相同程序可能表现不同。

答案 1 :(得分:1)

在您的第一个示例中,您写入的内存永远不会再次读取。只要行为相同,允许检测到这一点的符合标准的编译器就可以消除代码。由于程序不需要崩溃,编译器可以用空程序替换它。

答案 2 :(得分:0)

您正在写入已分配的数组空间。它会调用未定义的行为。在这种情况下,任何事情都可能发生。