如果我使用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
我的问题是为什么?
我相信正在发生的是,在所有情况下,我正在创建一个指针并为其分配我正在分配的堆内存块的起始地址。我错了吗?
答案 0 :(得分:3)
通常,函数会查看其参数的值并使用值来执行某些操作,因此传递特定值而不是随机或未指定的值非常重要。当你编写HashTableEntry *util = realloc(util, sizeof(HashTableEntry) * T->capacity);
时,你没有告诉编译器在调用util
函数时要在realloc
变量中放入什么值,所以你可能会得到未定义的行为,这是坏。
答案 1 :(得分:3)
答案 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
或堆中的已知位置。