如何将指针传递给函数?

时间:2012-10-27 18:29:37

标签: c pointers

我正在编写一个函数来查找哈希表中的值。为什么每到达第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 个答案:

答案 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。 mallocint值分配空间。

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 -------------------^ */