在注意到另一个项目中发生的奇怪事情后,我写了以下内容。即使阵列被多次调出越界,此代码也不会产生段错误。有人可以向我解释为什么运行下面的代码没有段错误吗?
#include <stdlib.h>
#include <stdio.h>
int main()
{
int *a = (int *)malloc(4 * sizeof(int));
int *b = (int *)malloc(3 * sizeof(int));
int i = 0;
for(i =0; i <3 ; i++)
{
b[i] = 3+i;
}
for(i = 0; i < 4; i++)
{
a[i] = i;
}
for(i = 0; i < 100 ; i++){
a[i] = -1;
}
for(i = 0 ; i < 100 ; i++){
printf("%d \n", b[i]);
}
}
答案 0 :(得分:2)
未定义未定义的行为。任何事情都可能发生,包括“正确”行为的出现。
答案 1 :(得分:2)
如果您尝试访问未映射到流程中的内存位置,则只会发生段错误。
mallocs取自构成堆的预分配内存的更大块。例如。系统可以在4K块中生成(或增加)堆,因此超出数组边界的范围仍然在已经分配给您的进程的堆内存块内(并且它将从中为后续分配内存) mallocs)。
在不同的情况下(以前分配了更多的内存,所以你的mallocs接近堆块的末尾),这可能是段错误的,但基本上不可能预测到这一点(特别是考虑到不同的平台或编译器)
答案 2 :(得分:1)
当进程尝试访问OS帐户不属于该进程的内存时,会发生分段错误。由于操作系统内部的内存记帐由页面完成(通常为1页= 4 KB),因此进程可以访问已分配页面中的任何内存而无需操作系统注意到它。
答案 3 :(得分:1)
new
而不是malloc