我试图理解以下代码的输出。
#include <stdio.h>
#include <stdlib.h>
main()
{
int *p = (int *) malloc(sizeof(int));
*p = 42;
*(p+1) = 41;
printf("%d -- %d\n", *p, p);
printf("%d\n", p[0]);
printf("%d -- %d\n", p[1], p+1);
free(p);
printf("%d --- %d\n", *p, p);
printf("%d --- %d\n", p[1], p+1);
}
我一步一步地理解如下:
int *p = (int *) malloc(sizeof(int));
p 现在指向 malloc 返回的内存块。
*p = 42;
将值 42 存储在 malloc 返回的位置。
*(p+1) = 41;
将值 41 存储在与 malloc 返回的位置直接相邻的位置。
free(p);
释放 p 指向的空间,该空间最初是通过调用 malloc 获得的,即int 42 的位置
结果:
42 -- 14327824
42
41 -- 14327828
0 --- 14327824
0 --- 14327828
我的理解是地址 14327824 由 malloc 返回。执行语句
*(p+1) = 41;时,值 41 已存储在 malloc 的块未返回中,即 p + 1 。
当调用free时,我知道它释放了 p 指向的空间,即值 42 。那么为什么存储在 p + 1 的值也被释放了?
此外,如果 malloc 将指针 pt 返回到未初始化的存储块。位置 pt + 1 是否超出 malloc 设置的存储区域的范围?
答案 0 :(得分:1)
您正在做的是未定义的行为。
int *p = (int *) malloc(sizeof(int));
这从sizeof(int)
返回的地址开始分配malloc
个字节。
当你这样做时
*(p+1) = 41;
您正在取消引用尚未在堆上分配的内存位置。其地址为p + sizeof(int)
,这是一个未管理的地址。
这会产生未定义的行为,通过观察结果无法得出的每个结论。