Предположим, что вы присваиваете значение NULL
до вызова функции f1
. Теперь способ определения f1 принимает его аргумент (указатель на int
) по значению. То есть b
будет другой переменной типа int *
, которая будет copy из a
. Так что b
тоже будет иметь значение NULL
. Теперь в f1
вы меняете значение на b
, присваивая ему адрес памяти, динамически выделяемый с помощью malloc
. Допустим, адрес памяти равен 0x123
. В результате этого присваивания значение b
изменилось с NULL
на 0x123
, но a
(в main
) продолжает удерживать NULL
, поскольку изменение b не изменит a
, так как это две отдельные переменные. В результате этого при возврате из функции f1
a останется без изменений.
Есть 2 способа решить эту проблему. Во-первых, вы можете заставить функцию f1
возвращать значение измененного b
, а затем присвоить его обратно в in main
, а во-вторых, вы можете передать a по адресу, чтобы любые изменения, сделанные в f1
, затронули а в main
тоже.
// f1 now returns the value of b.
int* f1() {
int *b = malloc(sizeof(int));
*b = 5;
return b;
}
int main() {
int *a = NULL;
a = f1(); // assign the return value of f1 to a.
printf("%d\n", *a); // prints 5...not its *a not just a.
return 0;
}
.
// f1 now takes the address of a.
void f1(int **b) {
*b = malloc(sizeof(int)); // you are actually altering a indirectly.
**b = 5;
}
int main() {
int *a = NULL;
f1(&a); // now pass the address of a to f1.
printf("%d\n", *a); // prints 5...not its *a not just a.
return 0;
}