尝试释放重新分配的内存会给出 free(): invalid pointer

Trying to free reallocated memory gives free(): invalid pointer

我不明白为什么我在 运行 这段代码时收到错误 free(): invalid pointer。我认为 p 将指向为结构预留的一块内存,所以我试图释放从 p 开始的指针,例如p+1,但是这样不行。我在这里错过了什么?

#include <stdio.h>
#include <stdlib.h>

struct s {
    int x;
    
};
int main()
{
    struct s *p = NULL;
    for (int i = 0; i < 3; i++) {
        if ((p = realloc(p, (i+1) * sizeof(struct s))) != NULL) {
            struct s x = {.x=i*10};
            *(p+i) = x;
            
        } else exit(EXIT_FAILURE);
    }
    for (int i=0;i<3;i++) {printf("%d ", (p+i)->x);}
    //free(p);
    free(p+1);
    //free(p+2);
    return 0;
}

在循环之前你声明了指针 p

struct s *p = NULL;

因此在循环之后它将存储最后一次重新分配内存的地址。

要释放分配的内存,您只需写入

free( p );

表达式p + 1指向动态分配数组的第二个未动态分配的元素。它是动态分配的整个数组。