重新初始化之前“释放”的指针
Reinitializing pointer previously 'free'd
我目前正在研究 CS50 的 Lab 4 - Volume。我有以下代码,我想知道在调用 free 之后在两个不同的地方使用相同的指针名称是否可以。
//Initialize tmp pointer and copy header bytes from input to output file
uint8_t *tmp = malloc(sizeof(uint8_t));
if (*tmp == NULL)
{
printf("Mem_ERR_2\n");
return 2;
}
for (int b = 0; b < 44; b++)
{
*tmp = fgetc(*input);
*output = fputc(*tmp);
printf("H_BYTE = %i\n", b++);
}
free(*tmp);
我已经 *tmp
初始化,取消引用它,现在我正在调用 free 。在此之后,我想为代码的不同部分创建第二个 *tmp
指针。我的问题是,为第二个指针初始化 uint16_t *tmp
是一种很好的做法,甚至在语法上都可以吗?或者我应该将它们更改为 *tmp1
和 *tmp2
?
首先,*tmp == NULL
行是一个错误。如果 malloc
失败并且 returns NULL
,则计算表达式 *tmp
将导致分段错误。相反,请尝试 tmp == NULL
。这也意味着 free(*tmp)
是一个错误 - 它应该是 free(tmp)
而不是。
现在,回答你的问题:在指针变量被释放后重新分配它是完全没问题的。例如,以下是完全有效的:
int * ptr = malloc(16);
free(ptr);
int x = 5;
ptr = &x;
ptr = malloc(16);
free(ptr);
我目前正在研究 CS50 的 Lab 4 - Volume。我有以下代码,我想知道在调用 free 之后在两个不同的地方使用相同的指针名称是否可以。
//Initialize tmp pointer and copy header bytes from input to output file
uint8_t *tmp = malloc(sizeof(uint8_t));
if (*tmp == NULL)
{
printf("Mem_ERR_2\n");
return 2;
}
for (int b = 0; b < 44; b++)
{
*tmp = fgetc(*input);
*output = fputc(*tmp);
printf("H_BYTE = %i\n", b++);
}
free(*tmp);
我已经 *tmp
初始化,取消引用它,现在我正在调用 free 。在此之后,我想为代码的不同部分创建第二个 *tmp
指针。我的问题是,为第二个指针初始化 uint16_t *tmp
是一种很好的做法,甚至在语法上都可以吗?或者我应该将它们更改为 *tmp1
和 *tmp2
?
首先,*tmp == NULL
行是一个错误。如果 malloc
失败并且 returns NULL
,则计算表达式 *tmp
将导致分段错误。相反,请尝试 tmp == NULL
。这也意味着 free(*tmp)
是一个错误 - 它应该是 free(tmp)
而不是。
现在,回答你的问题:在指针变量被释放后重新分配它是完全没问题的。例如,以下是完全有效的:
int * ptr = malloc(16);
free(ptr);
int x = 5;
ptr = &x;
ptr = malloc(16);
free(ptr);