С возвратом ответа через параметры (ссылка) - PullRequest
0 голосов
/ 27 октября 2011

Hy каждый,

Просьба рассмотреть этот небольшой код и помочь мне выяснить, почему он не работает?

#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 ]

3 голосов
/ 27 октября 2011

Вы ищете один из двух вариантов здесь.Вы можете либо выделить указатель памяти из уравнения и передать адрес памяти стандартной переменной:

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).

0 голосов
/ 27 октября 2011

c равно передать по значению .Когда вы передаете параметр в функцию, создается его копия.Вам нужно получить в качестве указателя указатель для достижения C ++ функции передачи по ссылке.

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

А при вызове это как -

setup(&helo) ;
0 голосов
/ 27 октября 2011

вы можете попробовать printf("Value: %d \n", (*helo)); вместо printf("Value: %s \n", (*helo));?

...