C通过参数返回答案(参考)

时间:2011-10-27 14:55:28

标签: function pointers parameters reference ansi

每个人,

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

#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;
}

3 个答案:

答案 0 :(得分:3)

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

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* helo中声明的main()副本,此本地副本将指向同一位置。因此,无论您对helo内的setup()做什么,都会更改变量的本地副本,而不会helo更改main()。这就是您需要将签名更改为setup(int** helo)

的原因

答案 1 :(得分:0)

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

答案 2 :(得分:0)

c 按值传递。将参数传递给函数时,会生成一个副本。您需要接收指针指针,以实现通过引用传递的C ++特性。

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

并称之为 -

setup(&helo) ;