【发布时间】:2011-03-11 16:42:18
【问题描述】:
我正在尝试学习 C,但在使用 char* 和 char 数组时遇到了麻烦。我正在使用库中的通用哈希集容器(我不想详细描述)。该库包含函数
void *HashSetLookup(hashset *h, const void *elemAddr);
我必须用它在哈希集中搜索以查看元素是否已经存在(哈希和比较函数是哈希集结构的一部分)。在这种情况下,我使用哈希集来存储指向 C 字符串的指针,或者更具体地说 (char * *) 。我的问题是以下代码给出了分段错误:
char word[1024];
/* Some code that writes to the word buffer */
HashSetLookup(stopList, &word);
虽然这段代码运行良好(并且符合预期):
char word[1024];
/* The same code as before that writes to the word buffer */
char* tmp = strdup(word);
HashSetLookup(stopList, &tmp);
free(tmp);
我认为 char word[] 和 char* 基本上是一回事。唯一的区别是 char word[1024] 位于堆栈中,长度固定为 1024,但堆中的 tmp 仅占用必要的空间(strlen(word)+1)。
因此我不明白为什么我必须在堆中复制字符串才能调用此函数。为什么会这样? char* tmp = strdup("something") 和 char word[1024] = "something" 之间有什么更根本的区别吗?
【问题讨论】:
-
显示第一个示例中写入 word 的代码。
-
我没有看到变量
tmp在第一个示例中的函数调用之前被声明/使用。 -
MAK,抱歉,这是一个错误。我现在已经修好了。
-
Jergason,我正在考虑这样做,但该代码基本上是五个函数调用的列表,它们都相当复杂。我认为这根本没有帮助。然而,我已经确定我实际上是在写字,所以这不是问题。事实上 word 将包含单词“BBC”(当然由 \0 关闭)。