【发布时间】:2023-03-03 00:40:01
【问题描述】:
我正在创建一个函数来加载哈希表,如果我的代码如下所示,我会遇到分段错误
bool load(const char *dictionary)
{
// initialize vars
char *line = NULL;
size_t len = 0;
unsigned int hashed;
//open file and check it
FILE *fp = fopen(dictionary, "r");
if (fp == NULL)
{
return false;
}
while (fscanf(fp, "%s", line) != EOF)
{
//create node
node *data = malloc(sizeof(node));
//clear memory if things go south
if (data == NULL)
{
fclose(fp);
unload();
return false;
}
//put data in node
//data->word = *line;
strcpy(data->word, line);
hashed = hash(line);
hashed = hashed % N;
data->next = table[hashed];
table[hashed] = data;
dictionary_size++;
}
fclose(fp);
return true;
}
但是如果我替换
char *line = NULL; by char line[LENGTH + 1];(其中长度为 45)
它有效。它们不是“等价的”吗?
【问题讨论】:
-
后者分配内存;前者没有。 “char *line”只是说“我想要一个可以指向字符的名为 'line' 的变量”,但它实际上并没有指向任何字符。
-
谁说它们是等价的?显然
char line[LENGTH + 1]正在谈论一些字节数——特别是其中的LENGTH + 1。但同样清楚地char *line = NULL涉及一个指针,该指针绝对不指向任何地方,当然也不指向任何明确定义的正确分配的字节数! -
char line[LENGTH + 1];表示line是一个数组,char *line = NULL;表示line是一个指针。这是完全不同的东西,但数组变量在使用时通常会衰减为指针。
标签: c segmentation-fault