c - 为什么 ia 数组大于为其分配的内存?

标签 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]);
}

据我所知,对于 j>1,我不应该在 st[j] 中输入一个数字。

非常感谢!!!

最佳答案

访问未分配的内存是“未定义的行为”。这意味着程序可以因运行时错误而退出,但并非必须如此。

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

关于c - 为什么 ia 数组大于为其分配的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21629396/

相关文章:

c - 在 c 的 srand 函数中,我需要在 '(unsigned int)' 之前添加 'time(null)' 吗?

c++ - 如何在 C/C++ 中创建微 shell ?

通过循环计算无法正常工作的行数

c - 给定 2^n,使用对数求 n

c++ - OSX 终端中的鼠标位置/控制

c++ - 向多个客户端 UDP 发送数据时不支持地址族

从相对路径创建目录和加载文件

c - 程序结果根据 printf 使用情况而变化

c - 我在哪里可以假定空字符将在 C 中自动添加?

c - linux 中的 sched_setaffinity cpu 亲和性