【问题标题】:C returning answer through parameters ( refernce)C通过参数返回答案(参考)
【发布时间】:2011-10-27 14:55:27
【问题描述】:

大家好,

请考虑一下这个小代码,并帮助我弄清楚为什么它不起作用?

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

void setup(int* helo) {
    helo = (int*) malloc(sizeof(int));
    (*helo) = 8;
}

int main(int argc, char* argv[]) {
    int* helo = NULL;
    setup(helo);
    printf("Value: %s \n", (*helo));
    getchar();
    return 0;
}

【问题讨论】:

  • 问题是,当我尝试阅读“helo”时,它仍然是 NULL
  • 你不是基本上将“null”传递给设置吗?设置完成后,您为 int 分配新内存 - 但该地址如何与调用者通信?
  • 它应该自动完成...
  • 怎么样? helo 是一个空指针,它没有指向任何地方。您将该空指针传递给 setup,然后将该指针的地址更改为新分配的一块内存。您将那块内存设置为 8。 main 中的 int* 仍然指向 null .. 您想要的是将指针传递给指针,然后初始化 /that/

标签: function pointers parameters reference ansi


【解决方案1】:

您正在这里寻找两个选项之一。您可以从等式中取出内存指针分配,然后传递标准变量的内存地址:

void setup(int* helo) 
{
    *helo = 8;
}

int main(int argc, char* argv[]) {
    int helo = 0;
    setup(helo);
    printf("Value: %d\n", helo);
    getchar();
    return 0;
}

或者,如果您想坚持您的方法,您的函数的签名需要更改以接收指向指针的指针:

void setup(int** helo) {
    *helo = (int*) malloc(sizeof(int));
    *(*helo) = 8;
}

int main(int argc, char* argv[]) {
    int* helo = NULL;
    setup(&helo);
    printf("Value: %d \n", (*helo));
    getchar();
    return 0;
}

原因是setup(int* helo)收到了int* helomain()中声明的副本,而这个本地副本将指向同一个地方。因此,无论您在setup() 中使用helo 做什么,都会更改变量的本地副本,而不是从main() 更改helo。这就是为什么您需要将签名更改为setup(int** helo)

【讨论】:

    【解决方案2】:

    你可以试试printf("Value: %d \n", (*helo)); 代替printf("Value: %s \n", (*helo)); 吗?

    【讨论】:

    • 一样,我得到NULL值,我不知道为什么,但是在函数中“malloc”工作正常但它没有返回值......
    【解决方案3】:

    c 是按值传递。当您将参数传递给函数时,会生成它的副本。您需要接收作为指针的指针,以实现 C++ 引用传递的特性。

    void setup(int** helo) {
        *helo = (int*) malloc(sizeof(int));
        (*(*helo)) = 8;
    }
    

    并且在调用它时 -

    setup(&helo) ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-03
      • 2018-09-20
      • 2012-12-12
      • 2014-11-07
      • 1970-01-01
      • 1970-01-01
      • 2021-02-14
      相关资源
      最近更新 更多