重新初始化之前“释放”的指针

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);