免费理解malloc和指针增量

时间:2015-09-29 17:00:05

标签: c pointers memory-management malloc free

我试图理解以下代码的输出。

#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 设置的存储区域的范围?

1 个答案:

答案 0 :(得分:1)

您正在做的是未定义的行为。

int *p = (int *) malloc(sizeof(int));

这从sizeof(int)返回的地址开始分配malloc个字节。

当你这样做时

*(p+1) = 41;

您正在取消引用尚未在堆上分配的内存位置。其地址为p + sizeof(int),这是一个未管理的地址。

这会产生未定义的行为,通过观察结果无法得出的每个结论