【问题标题】:Reinitializing pointer previously 'free'd重新初始化以前“释放”的指针
【发布时间】:2021-10-19 02:52:31
【问题描述】:

我目前正在研究 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,取消了它的引用,现在我可以免费调用它了。在此之后,我想为代码的不同部分创建第二个 *tmp 指针。我的问题是,为第二个指针初始化 uint16_t *tmp 是一种很好的做法,甚至在语法上也可以?还是应该将它们更改为*tmp1 和*tmp2?

【问题讨论】:

  • 这能回答你的问题吗? Best practices to avoid problems with pointers
  • 语法上我认为不是(不同的类型、变量的重新声明等),但就“良好做法”而言,我会在“否”阵营中。尝试考虑一个比 tmp 更相关的变量名称。
  • 好吧,我有点这么想,但我想得到一些意见。至于链接的帖子,我并没有真正看到我在寻找什么,但我并没有深入挖掘所有内容。我一定会仔细阅读那篇文章,因为那里似乎有一些不错的信息。

标签: cs50


【解决方案1】:

首先,*tmp == NULL 行是一个错误。如果malloc 失败并返回NULL,则计算表达式*tmp 将导致分段错误。相反,请尝试tmp == NULL。这也意味着free(*tmp) 是一个错误——它应该是free(tmp)。

现在,回答您的问题:在指针变量被释放后重新分配它是非常好的。例如,以下是完全有效的:

int * ptr = malloc(16);
free(ptr);

int x = 5;
ptr = &x;

ptr = malloc(16);
free(ptr);

【讨论】:

    猜你喜欢
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    相关资源
    最近更新 更多