由于错误的认识,不去检验new_size是否为0,还是按照new_size不为0的逻辑处理,最后并free(new_ptr)。这里就引入了double free的问题,造成程序崩溃。
realloc()函数的返回值是void *型的。有下面三种情况:
1、返回void * 指针,调用成功。Void *型的指针指向新分配的内存空间。在需要的情况下可以再对这个指针进行强制类型转换,转换成你需要的类型的指针。如果传入的第一个指针参数为NULL,则该函数等同与malloc函数。
2、返回NULL,当需要扩展的大小(第二个参数)为0并且第一个参数不为NULL,此时原内存被“freed”掉了。
我们知道,realloc是从堆上分配内存的,当扩大一块内存空间时, realloc()试图直接从堆上现存的数据后面的那些字节中获得附加的字节,如果能够满足,自然天下太平;可如果数据后面的字节不够的话,那么就使用堆上第一个有足够大小的自由块,现存的数据然后就被拷贝至新的位置,而老块则放回到堆上。返回值指向新分配的内存地址。
由于在这其中可能会发生数据的移动,因此我们应该尽力避免下面的用法。
…………………………
#include
char *p,*q;
p = (char * ) malloc (10);
q=p;
p = (char * ) realloc (p,20);
…………………………
在这种情况下,如果发生了数据的移动,p指向了新分配的内存地址,但是指针q还依然指向原先的内存地址,而原先的那部分内存已经在realloc函数中free掉了,因此指针q成了“野指针”,指向了一块未知的内存区域,这是很危险的。类似的,我们也应该尽量避免下面这种情况的使用。
…………………………
q = (char * ) realloc (p,20);
………………………
与第一种情况类似,如果发生了数据的移动,q指向了新分配的内存地址,而指针p还依然指向原先的内存地址,此时p成了野指针。如果不得以非得这样使用的话(估计这种情况是不存在的),我们也应该紧跟此后将指针p置为NULL。
…………………………
q = (char * ) realloc (p,20);
p = NULL;