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