在函数中传递空指针

Mar*_*ith 3 c null pointers

这个变量 num 保持为 0。我怀疑这是因为我传入了一个 NULL 指针,但我被限制在主(和参数)中。如何调整辅助函数的内容以正确更新 num?

int main(void) {
    int * num_results = NULL;
    int num = 4;
    set(num_results, num);
    printf(“%d\n”, *num_results);
    return 0;
}

void set(int * results,num){
    num_results = malloc(sizeof(int));
    *num_results = num;
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*ael 6

我会猜测你对你的问题的真正意思,并尝试给出一个体面的答案。

我猜你想通过将它作为指针传递给函数来改变num_results等于,我可以看到你犯了一些错误:numset

  1. 你可能在你的完整代码中有这个,但不要忘记#include <stdio.h>使用printf()和#include <stdlib.h>使用malloc()
  2. 你的函数set()应该在之前声明main(),你可以通过在之前声明一个原型main()或简单地在set()之前定义函数来做到这一点main()。

现在让我们来看看您的解决方案:您想将num_results作为参数传递给函数,分配一些内存并将地址分配给num_results,然后将值更新为num.

当您将 anint *作为参数传递时,我想您已经知道通过传递int您只是提供了一个int变量内部内容的副本。这与 的工作方式相同int *,您不会传递对 的引用,num_results以便您可以更新指针的地址,而是传递当前地址的副本,NULL不会被修改。什么可以被修改是什么,是当前地址内,但目前的地址NULL,所以不能够真正被修改。

由于您要分配内存并将其地址分配给num_results,您必须传递一个指向指针的指针,因此您传递的int*是保存变量的地址以及您可以实际更改它的地址。

这样,您的函数应该看起来像,void set(int ** results, int num)并且您应该使用 调用它set(&num_results, num),因此您传递了对 num_results 的引用,您可以在其中更改它当前指向NULL的地址,然后是由 返回的地址malloc()。

您还必须更改函数的主体,因为您现在使用的是int **,您想将新地址分配给*results, 因为results == &num_results,并将 num 分配给**results, 因为*results = num_results。

我希望我的解释不会很混乱,希望有人可以用另一个答案或编辑我的答案更好地解释它。最终代码:

#include <stdio.h>
#include <stdlib.h>

void set(int ** results, int num){
    *results = malloc(sizeof(int));
    **results = num;
}

int main(void) {
    int * num_results = NULL;
    int num = 4;
    set(&num_results, num);
    printf("%d\n", *num_results);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)