0

我正在编写一个函数来查找哈希表中的值。为什么每次到达第 6 行都会出现运行时错误?请帮忙!

int* value = 0;
printf ("find return value: %d \n", find(keyList[i], value));

上面两行是main中用到的函数调用。

int find( char *key, int *p_ans ){
int hashValue = hash(key);
entry* newTable = table[hashValue];
while (newTable != NULL){
    if ((newTable -> key) == key){
        *p_ans = newTable -> val; // THE ERROR LINE
        return 1;
    }
    newTable = newTable -> next;
}
return 0;
}
4

4 回答 4

3

因为p_ans == NULL. 将您的呼叫更改为以下之一:

int value;

if (find(keyList[i], &value)) {
    printf ("find return value: %d\n", value);
}
else {
    printf ("not found\n");   
}

int *value = malloc(sizeof(int));

if (find(keyList[i], value)) {
    printf ("find return value: %d\n", *value);
}
else {
    printf ("not found\n");   
}

free(value);

关键是您需要为整数分配空间。如果你有一个局部变量int value,那么你可以传递它的地址并find改变变量的值。

如果你有,int *value那么你有一个指针。这个指针需要指向某个地方的 int。为一个值malloc分配空间。int

写入int *value = 0不会创建值为 0 的 int,它会创建一个值为 NULL 的 int指针(当用作指针值时,0 表示 NULL)。您不能取消引用此 NULL 指针。如果您调用find(keyList[i], NULL)then p_ans == NULL,并*p_ans取消引用 NULL 指针并使您的程序崩溃。

如果仍然没有意义,请考虑这两个代码片段。第一个会崩溃。第二个将起作用。你明白为什么吗?

// Bad
int *pointer = NULL;
if (find(keyList[i], pointer))

// Good
int value;
int *pointer = &value;
if (find(keyList[i], pointer))
于 2012-10-27T18:31:39.303 回答
3

您需要int在函数外部分配;在堆栈上或堆上。要将它分配到堆栈上,只需执行

int ans;
find(key, &ans);

要在堆上分配它,请执行

int* p_ans = new int;
find(key, p_ans);
...
delete p_ans;
于 2012-10-27T18:34:09.393 回答
3

你正在设置这个:

*p_ans = newTable -> val; // THE ERROR LINE

为此,您必须在 p_ans 处进行 malloc,但您的 p_ans 指针为 0,它是从指向 0 的“值”变量获得的,这就是问题所在

添加这一行:

value = (int *)malloc(sizeof(int));
于 2012-10-27T18:34:51.263 回答
1

这是因为您将指针传递给NULL. 您不必实际声明指针以将指针传递给函数,而是使用地址操作符&

int value = 0;
printf ("find return value: %d \n", find(keyList[i], &value));
/* Using address-of operator here -------------------^ */
于 2012-10-27T18:35:08.827 回答