下面是一个了解未定义行为的程序。我正在为 ptr 分配 10 *4 = 40 字节的内存并且我正在尝试访问,所以它必须在完成 *(ptr+0x100) 时给我一个超过 40 字节的段错误。从代码中观察到的是,它在 *(ptr+0xc000) 处给了我段错误。当它超出堆的大小时,它会给出段错误吗?为什么当 ptr 尝试访问超出分配给它的 40 个字节边界的 ptr+100 时它没有给我一个 seg 错误。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
main()
{
int * ptr = malloc(10 * sizeof(int) );
*ptr = 0x100;
printf(" Done 1\n");
*(ptr+0x9) = 0x90;
printf(" Done 2\n");
*(ptr+0x100) = 0x400;
printf(" Done 3\n");
*(ptr + 0x1000) = 0x4000;
printf(" Done 4\n");
*(ptr + 0x4000) = 0x4000;
printf(" Done 5\n");
*(ptr + 0x8000) = 0x8000;
printf(" Done 6\n");
*(ptr + 0xc000) = 0xc000;
printf(" Done 7\n");
}