尝试释放重新分配的内存会给出 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
指向动态分配数组的第二个未动态分配的元素。它是动态分配的整个数组。
我不明白为什么我在 运行 这段代码时收到错误 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
指向动态分配数组的第二个未动态分配的元素。它是动态分配的整个数组。