将 realloc() 返回的地址分配给同一个指针是好的编码习惯吗?
Is it good coding practice to assign the address returned by realloc() to the same pointer?
我在一些网站上看到了一些与 realloc() 相关的代码,如下所示。
int *p = (int *)malloc(sizeof(int) * 10);
p = (int *)realloc(p, 100);
但是正如标准所说,如果 realloc 失败,原始块将保持不变并且它 returns NULL。
所以如果 realloc 失败,从上面的例子中,我们将失去释放 p 的能力。任何人都可以让我知道将 realloc() 返回的地址分配给同一个指针是好的编码习惯吗?
您是正确的,直接将 realloc
的 return 值分配给原始指针的唯一副本是一种不好的做法。如果 realloc
失败,您不仅会失去 free
记忆的能力(我认为这是次要问题);您还丢失了指针指向的数据。
对于某些程序,这可能无关紧要(例如,如果您只是要终止并中止分配失败的整个操作,这可能是也可能不是可接受的做法,这本身就是一个完整的主题)但是一般来说,你需要先将realloc
的结果存储到一个单独的临时变量中,只有在检查成功后才覆盖原来的指针变量。
R。明确回答了你的问题。让我强调代码片段中的另外两个问题:
int *p = (int *)malloc(sizeof(int) * 10);
p = (int *)realloc(p, 100);
在 C 语言中,强制转换 malloc()
、calloc()
和 realloc()
的 return 值通常被认为是不好的做法。 void *
return 值将自动转换为适当的指针类型,除非代码被编译为 C++ 代码,它是 C 的远亲。
更重要的是,realloc
指向硬编码大小 100
的指针没有意义。在重新分配的数组中可访问的 int
的数量将取决于 int
类型的实际大小,这可能因系统而异。事实上,在某些架构上,100
甚至不是 sizeof(int)
的倍数。作者可能打算写 p = realloc(p, sizeof(int) * 100);
或 p = realloc(p, sizeof(*p) * 100);
,片段周围的更多上下文可能有助于理解其意图...正如所写的那样,由于多种原因,它很可能是一个错误。
我在一些网站上看到了一些与 realloc() 相关的代码,如下所示。
int *p = (int *)malloc(sizeof(int) * 10);
p = (int *)realloc(p, 100);
但是正如标准所说,如果 realloc 失败,原始块将保持不变并且它 returns NULL。
所以如果 realloc 失败,从上面的例子中,我们将失去释放 p 的能力。任何人都可以让我知道将 realloc() 返回的地址分配给同一个指针是好的编码习惯吗?
您是正确的,直接将 realloc
的 return 值分配给原始指针的唯一副本是一种不好的做法。如果 realloc
失败,您不仅会失去 free
记忆的能力(我认为这是次要问题);您还丢失了指针指向的数据。
对于某些程序,这可能无关紧要(例如,如果您只是要终止并中止分配失败的整个操作,这可能是也可能不是可接受的做法,这本身就是一个完整的主题)但是一般来说,你需要先将realloc
的结果存储到一个单独的临时变量中,只有在检查成功后才覆盖原来的指针变量。
R。明确回答了你的问题。让我强调代码片段中的另外两个问题:
int *p = (int *)malloc(sizeof(int) * 10);
p = (int *)realloc(p, 100);
在 C 语言中,强制转换 malloc()
、calloc()
和 realloc()
的 return 值通常被认为是不好的做法。 void *
return 值将自动转换为适当的指针类型,除非代码被编译为 C++ 代码,它是 C 的远亲。
更重要的是,realloc
指向硬编码大小 100
的指针没有意义。在重新分配的数组中可访问的 int
的数量将取决于 int
类型的实际大小,这可能因系统而异。事实上,在某些架构上,100
甚至不是 sizeof(int)
的倍数。作者可能打算写 p = realloc(p, sizeof(int) * 100);
或 p = realloc(p, sizeof(*p) * 100);
,片段周围的更多上下文可能有助于理解其意图...正如所写的那样,由于多种原因,它很可能是一个错误。