c - 为什么在 realloc 函数中使用 NULL ing 指针



如果我用malloc执行以下操作

HashTableEntry *util = malloc(sizeof(HashTableEntry) * T->capacity);

一切正常。但是,如果我对realloc执行以下操作

HashTableEntry *util = realloc(util, sizeof(HashTableEntry) * T->capacity);

realloc返回NULL .我还收到 gcc 的警告,说我在使用它之前没有初始化util

但是,以下内容效果很好,就像malloc

HashTableEntry *util = NULL;
util = realloc(util, sizeof(HashTableEntry) * T->capacity);

我的问题是为什么?

我相信正在发生的事情是,在所有情况下,我都在创建一个指针,并将我正在分配的堆内存块的起始地址分配给它。我在某个地方错了吗?

通常,函数会查看其参数的值并使用这些值来执行某些操作,因此传递特定值而不是随机或未指定的值非常重要。 当你编写HashTableEntry *util = realloc(util, sizeof(HashTableEntry) * T->capacity);时,你还没有告诉编译器在调用realloc函数时在util变量中放入什么值,所以你可能会得到未定义的行为,这是不好的。

  1. 如果第一个参数是空指针,则对于指定大小,realloc()的行为类似于 malloc((。

  2. 如果第一个参数是未初始化的指针(错误的指针(,则realloc()将无法正常工作,因此它返回 NULL。

  3. 如果第一个参数是有效地址,则realloc() 解除分配旧对象并返回指向新对象的指针,或者扩展旧对象的内存(由操作系统决定(。

函数调用中可以看出

HashTableEntry *util = realloc(util, sizeof(HashTableEntry) * T->capacity);

函数realloc使用参数util。如果它具有不确定的值,则该函数具有未定义的行为。

此外,在使用任何函数之前,您应该阅读其描述及其每个参数的用途。

来自 C 标准(7.22.3.5 realloc 函数(

2 realloc 函数解除分配指向的旧对象 PTR 并返回指向大小为 由大小指定....

3 如果 ptr 是空指针,则 realloc 函数的行为类似于 指定大小的 malloc 函数。

在第二种情况下util在传递到realloc()时未初始化。因此,realloc()的行为是不确定的。

HashTableEntry *util = realloc(util, sizeof(HashTableEntry) * T->capacity);
                             //^^^^ This value is undefined.

在第三种情况下,您将其初始化为NULL在这种情况下,realloc()的行为类似于malloc()

需要注意的一些事项:

调用realloc()时,不要直接分配给目标指针。 而是分配给临时指针,然后在分配给目标指针之前检查 (!=NULL(。

然后,如果/当realloc()失败时,原始指针将不会丢失。 丢失此类指针会导致内存泄漏。

注意:realloc()的第一个参数是"源"指针。 它必须指向有意义的东西,比如NULL或堆中的已知位置。

相关内容

  • 没有找到相关文章

最新更新