为什么在realloc函数中使用它之前使用NULL指针?

时间:2017-05-21 20:54:37

标签: c pointers null allocation realloc

如果我使用string input = "company1|23|NJ|0321;company2|24|PH|0322;company3|25|NY|0323;company4|26|PA|0323"; List<string> resultLevel2 = new List<string>(); string[] resultLevel1 = input.Split(';'); foreach (var item in resultLevel1) { resultLevel2.Add(item.Split('|')[2]); } string output = string.Join(";", resultLevel2);

执行以下操作
malloc
一切顺利。但是,如果我使用HashTableEntry *util = malloc(sizeof(HashTableEntry) * T->capacity);

执行以下操作
realloc

HashTableEntry *util = realloc(util, sizeof(HashTableEntry) * T->capacity); 返回realloc。我也收到了gcc的警告,说我在使用之前没有初始化NULL

但是,以下效果非常好,例如util

malloc

我的问题是为什么?

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

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:1)

从函数调用中可以看出

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

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

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

来自C标准(7.22.3.5重新分配功能)

  

2 realloc函数释放指向的旧对象   ptr 并返回指向具有该大小的新对象的指针   由size ....指定。

  

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

答案 3 :(得分:1)

在第二种情况下,util在传递到realloc()时未初始化。 所以realloc()的行为未定义。

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

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

答案 4 :(得分:0)

需要注意的一些事项:

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

然后,如果/ realloc()失败,原始指针不会丢失。丢失这样的指针会导致内存泄漏。

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