我很困惑为什么在将 list 设置为指向 tmp 指向的位置后,此代码释放列表而不是 tmp (
list = tmp;
)
// Implements a list of numbers with an array of dynamic size
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
// List of size 3
int *list = malloc(3 * sizeof(int));
if (list == NULL)
{
return 1;
}
// Initialize list of size 3 with numbers
*list = 1;
*(list + 1) = 2;
*(list + 2) = 3;
// List of size 4
int *tmp = malloc(4 * sizeof(int));
if (tmp == NULL)
{
free(list);
return 1;
}
// Copy list of size 3 into list of size 4
for (int i = 0; i < 3; i++)
{
tmp[i] = list[i];
}
// Add number to list of size 4
tmp[3] = 4;
// Free list of size 3
free(list);
// Remember list of size 4
list = tmp;
// Print list
for (int i = 0; i < 4; i++)
{
printf("%i\n", list[i]);
}
// Free list
free(list);
return 0;
}
唯一重要的是,您使用与
free
接手时相同的 地址 来拨打 malloc
。分配的内存与该地址相关联,而不是与指针变量名称相关联。
free(list);
处,您释放了用 int *list = malloc(3 * sizeof(int));
分配的第一个块。list = tmp;
现在list
和tmp
都指向同一个位置,从这个malloc调用返回的地址:int *tmp = malloc(4 * sizeof(int));
free(list)
或free(tmp)
,这并不重要,因为它们指向同一位置,并且这是从malloc(4 ...
调用返回的原始地址。free()
之后,list
和tmp
都是“悬空指针”,它们指向不再可用的内存区域。因此,在调用 free 之后直接将指针设置为 NULL
通常是一个好习惯。