【发布时间】:2017-10-21 10:51:03
【问题描述】:
如果我使用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);
我的问题是为什么?
我相信正在发生的事情是,在所有情况下,我都在创建一个指针并将我正在分配的堆内存块的起始地址分配给它。我是不是哪里错了?
【问题讨论】:
-
典型的使用模式是
malloc初始块然后realloc如果/当需要。将NULL传递给realloc只是调用malloc的一种奇怪方式。 -
不,这并不奇怪。函数的参数应该总是被初始化,因为函数可能使用参数的值。如果不初始化参数,编译器不知道该怎么做。
-
当您将 未初始化 垃圾指针传递给
realloc时,您期望它如何工作?您是如何期望realloc知道您希望它充当malloc的? -
@user3386109:典型的使用模式是将指针设置为空,然后仅使用
realloc,利用realloc(NULL,等价于malloc这一事实。这会产生更优雅和更紧凑的代码,而无需不必要的分支和/或拆分。然而,很多人不知道他们可以在这样的代码中统一使用realloc,因此他们坚持将第一次分配分成“特殊情况”并使用malloc。这会导致更丑陋的代码。
标签: c pointers null allocation realloc