根据realloc函数的说明:realloc()函数会返回一个指向新分配内存的指针,该内存适合于任何类型的变量,并且可能与ptr不同,如果请求失败,则返回NULL。
因此,在这段代码片段中:
ptr = (int *) malloc(sizeof(int));
ptr1 = (int *) realloc(ptr, count * sizeof(int));
if(ptr1 == NULL){ //reallocated pointer ptr1
printf("Exiting!!\n");
free(ptr);
exit(0);
}else{
free(ptr); //to deallocate the previous memory block pointed by ptr so as not to leave orphaned blocks of memory when ptr=ptr1 executes and ptr moves on to another block
ptr = ptr1; //deallocation using free has been done assuming that ptr and ptr1 do not point to the same address
}
假设重新分配的指针只指向不同的内存块而不是相同的内存块,这样就足够了吗?因为如果这个假设不成立,并且realloc返回指向ptr原始内存块的地址,然后执行free(ptr)(由于评论中的原因),那么该内存块将被清除,程序会崩溃。
我是否应该再加入另一个条件来比较ptr和ptr1的相等性,并排除执行free(ptr)语句的可能性?
man realloc
的说明是:“……如果没有足够的空间来扩大 ptr 所指向的内存分配,realloc() 将创建一个新的分配,将尽可能多的旧数据复制到新的分配中,释放旧的分配,并返回指向已分配内存的指针。……” - meaning-mattersmalloc
和realloc
的结果进行强制类型转换。 - emlai