我正在学习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" 之间是否存在更基本的区别?
tmp
被声明或使用。 - MAK