如果我用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
变量中放入什么值,所以你可能会得到未定义的行为,这是不好的。
-
如果第一个参数是空指针,则对于指定大小,
realloc()
的行为类似于 malloc((。 -
如果第一个参数是未初始化的指针(错误的指针(,则
realloc()
将无法正常工作,因此它返回 NULL。 -
如果第一个参数是有效地址,则
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
或堆中的已知位置。