Punteros y argumentos de función

El siguiente fragmento de código da a la salida 11 11 un valor indefinido. Pero ¿por qué obtengo el valor indefinido cuando se ejecuta la misma instrucción por segunda vez? ¿Eso tiene algo que ver con el scope de la función?

void foo(int **const p) { int j = 11; *p = &j; printf("%d ", **p); } int main() { int i = 10; int *p = &i; foo(&p); printf("%d ", *p); printf("%d ", *p); return 0; } 

Está apuntando a un elemento que ya ha sido desasignado tan pronto como la función foo regresa. Esto es un error, entonces el comportamiento indefinido sucede.

Después de que una variable queda fuera del scope, no se sobrescribe automáticamente, su valor simplemente permanece allí hasta que alguna otra instrucción usa esa ubicación de memoria para almacenar otro valor. En el ejemplo, la ejecución de la primera impresión sobrescribe la ubicación de memoria señalada por p, por eso, cuando la lees por segunda vez, ves que su valor ha cambiado.

Podrías arreglarlo de la siguiente manera:

 void foo(int **const p) { int *j = (int *)malloc(sizeof(int)); *p = j; printf("%d ", **p); } int main() { int i = 10; int *p = &i; foo(&p); printf("%d ", *p); printf("%d ", *p); free(p) return 0; } 

No es bello pero para fines educativos puede ser bueno.

Cuando foo() sale, *p apunta a una variable que ya no existe. Por lo tanto estás invocando un comportamiento indefinido.