有人可以解释为什么这段代码有效,即使我只为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输入一个数字。
非常感谢!!!
答案 0 :(得分:4)
访问未分配的内存是“未定义的行为”。这意味着程序可以以运行时错误退出,但它没有。
许多编译器在分配的内存周围构建带有某些保存的代码,以便在写入超出它时导致崩溃,但这些不必在任何条件下工作。在你的特殊情况下,似乎在数组边界上的12个字节不会触发它,但是会有16个字节。但这也是你不能也不应该依赖的东西。根据其他情况,另一个程序,与其他选项编译的相同程序,甚至在不同时间执行的相同程序可能表现不同。
答案 1 :(得分:1)
在您的第一个示例中,您写入的内存永远不会再次读取。只要行为相同,允许检测到这一点的符合标准的编译器就可以消除代码。由于程序不需要崩溃,编译器可以用空程序替换它。
答案 2 :(得分:0)
您正在写入已分配的数组空间。它会调用未定义的行为。在这种情况下,任何事情都可能发生。