谁能解释为什么这段代码有效,即使我只为 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]);
}
据我所知,对于 j>1,我不应该在 st[j] 中输入一个数字。
非常感谢!!!
最佳答案
访问未分配的内存是“未定义的行为”。这意味着程序可以因运行时错误而退出,但并非必须如此。
许多编译器在分配的内存周围使用某些保护措施构建代码,以在超出它的范围内写入时导致崩溃,但这些代码不必在任何条件下工作。在您的特殊情况下,似乎在数组边界上移动 12 个字节不会触发它,但 16 个字节会触发它。但这也是您不能也不应该依赖的东西。根据其他情况,另一个程序、使用其他选项编译的同一程序甚至在不同时间执行的同一程序可能表现不同。
关于c - 为什么 ia 数组大于为其分配的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21629396/