使用 free 理解 malloc 和指针递增

Understanding malloc and pointer incrementation with 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指向的space,它最初是通过调用malloc获得的,即int 42.

的位置

结果:

42 -- 14327824
42
41 -- 14327828
0 --- 14327824
0 --- 14327828

我的理解是地址14327824malloc返回了。当语句

*(p+1) = 41;
被执行时,值41已经存储在一个块not returnedmalloc,即 p+1.

调用 free 时,我了解到它释放了 p 指向的 space,即值 42.那为什么存储在p+1的值也被释放了呢?

此外,如果 malloc returns 指向未初始化存储块的指针 ptpt+1位置是否超出了malloc设置的存储区范围?

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

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

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

当你这样做时

*(p+1) = 41;

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

这会产生未定义的行为,您通过观察结果得出的每一个结论都是无关紧要的