我正在编写一个函数来查找哈希表中的值。为什么每到达第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;
}
答案 0 :(得分: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,它会创建一个int 指针,其值为NULL(0表示用作指针值时为NULL)。您无法取消引用此NULL指针。如果您拨打find(keyList[i], NULL)
,然后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))
答案 1 :(得分:3)
您需要在函数外部分配int
;无论是在堆栈上还是在堆上。
要在堆栈上分配它,只需执行
int ans;
find(key, &ans);
要在堆上分配它,请执行
int* p_ans = new int;
find(key, p_ans);
...
delete p_ans;
答案 2 :(得分:3)
您正在设置:
*p_ans = newTable -> val; // THE ERROR LINE
为此你必须在p_ans中使用malloc,但是你的p_ans指针是0,它是从'value'变量获得的,它指向0,这就是问题
添加以下行:
value = (int *)malloc(sizeof(int));
答案 3 :(得分:1)
这是因为您将指针传递给NULL
。您不必实际声明一个指针来传递指向函数的指针,而是使用address-of运算符&
:
int value = 0;
printf ("find return value: %d \n", find(keyList[i], &value));
/* Using address-of operator here -------------------^ */