目录
前言
在写数据结构的串时,测试串插入函数的时候,弹出错误如下,经过调试得知是在调用realloc()函数的时候出错,然后换成malloc或者calloc函数则没有出现这个错误,经过一番研究发现问题所在——即,realloc函数的第一个参数所指向的空间必须是之前malloc、calloc或者realloc过的,或者是空指针,否则就会出现如下问题。
char* ps = (char*)realloc(S->data, newcapacity1*sizeof(char));
realloc实例
下面的代码运行后就会出现上图的错误。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int sample = 10;
int * a= &sample;
int* ptr = (int*)realloc(a, 5 * sizeof(int));//指针a之前没有动态分配内存过,也不是NULL
for (int i = 0;i < 5;i++)
printf("%d ", ptr[i]);
return 0;
}
原理
原因如下:
看到realloc函数的ptr参数,它要求该指针指向的内存块,之前是malloc、calloc或者relloc过的,或者是空指针,只能是这四种情况,其余情况不可以。
正确示范
换成calloc如下,以及运行结果,这种情况就是正常的,因为calloc没有上述要求:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int sample = 10;
int * a= &sample;
int* ptr = (int*)calloc(5, sizeof(int));
for (int i = 0;i < 5;i++)
printf("%d ", ptr[i]);
return 0;
}
再把realloc第一个参数(a)换成原本指向NULL,代码和运行结果如下,因为realloc函数不会把空间初始化为0,所以是随机值:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int sample = 10;
int* a = NULL;
int* ptr = (int*)realloc(a, 5*sizeof(int));
for (int i = 0;i < 5;i++)
printf("%d ", ptr[i]);
return 0;
}
free函数的使用错误
代码和运行结果如下:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int sample = 10;
int* a = &sample;
free(a);
return 0;
}
原理
free函数和realloc类似,参数也是要之前调用过malloc、calloc和realloc进行动态分配的,或者如果是空指针不会操作。
正确示范
正确使用方法如下(因为malloc分配好空间后不初始化,所以是随机值):
#include<stdio.h>
#include<stdlib.h>
int main()
{
int* a = (int*)malloc(5 * sizeof(int));
for (int i = 0;i < 5;i++)
printf("%d ", a[i]);
free(a);
return 0;
}