vamos a suponer que se asigna un valor de NULL
antes de llamar a la función f1
.Ahora, como se define f1, toma su argumento (puntero a int
) por valor. Es b
será otra variable del tipo int *
que será copia de a
. Entonces b
también tendrá un valor de NULL
. Ahora, en f1
, cambie el valor por b
asignándole la dirección de memoria asignada dinámicamente usando malloc
. Digamos que la dirección de memoria es 0x123
. Como resultado de esta asignación, b
ha cambiado su valor NULL
-0x123
pero a
(en main
) continúa para mantener NULL
, porque el cambio b no cambiará a
, ya que son dos variables separadas. Como resultado de esto, cuando regrese de la función f1
a no se modificará.
Hay 2 formas de solucionar esto. Uno puede hacer que la función f1
devuelva el valor del b
cambiado y luego asignarlo a a en main
y dos, puede pasar la dirección a para que cualquier cambio realizado en f1
afectará también a 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;
}
Esto es de nuevo pasar por valor. Está pasando la dirección de a por valor. ** No hay pase por referencia en C ** – raj
Lo suficientemente bueno. Actualizado para ser más preciso en C. – Dusty