C возвращает ответ через параметры (ссылка)

#function #pointers #parameters #reference #ansi

#функция #указатели #параметры #ссылка #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;
}
 

Комментарии:

1. проблема в том, что когда я пытаюсь прочитать «helo», он по-прежнему равен НУЛЮ

2. Разве вы в основном не передаете «null» в setup? После установки вы выделяете новую память для своего int — но как этот адрес передается обратно вызывающему?

3. он должен делать это автоматически…

4. Как? helo — это нулевой указатель, он указывает в никуда. Вы передаете этот нулевой указатель в setup, а затем меняете адрес этого указателя на недавно выделенную часть памяти. Вы устанавливаете для этого фрагмента памяти значение 8. Значение int* обратно в main по-прежнему указывает на null .. Что вы хотите, так это передать указатель на указатель, а затем инициализировать / это/

Ответ №1:

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

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

int main(int argc, char* argv[]) {
    int helo = 0;
    setup(helo);
    printf("Value: %dn", 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(amp;helo);
    printf("Value: %d n", (*helo));
    getchar();
    return 0;
}
 

Причина этого в том, что setup(int* helo) получает копию int* helo , объявленную в main() , и эта локальная копия будет указывать на то же место. Поэтому все, что вы делаете с helo inside setup() , будет изменять локальную копию переменной, а не helo from main() . Вот почему вам нужно изменить подпись на setup(int** helo) .

Ответ №2:

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

Комментарии:

1. То же самое, я получаю нулевое значение, я не знаю почему, но в функции «malloc» работает правильно, но не возвращает значение…

Ответ №3:

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

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

И при вызове его как —

 setup(amp;helo) ;