¿Se pueden conservar las direcciones de las variables locales en las funciones que devuelven los punteros?

#include int* a(int* b){ int a = 20; printf("\n \n"); if(a == 20){ printf("\n return from if a : 0x%x \n",a); return &a; } else{ printf("\n returning from else b : 0x%x\n",b); return b; } } int main(){ int n = 10; int *k,*m; k = &n; m = a(k); printf("\nm ; 0x%xm : %d \n",m,*m); return 0; } 

Aquí estoy devolviendo la variable local de la función que devuelve el puntero. Durante la salida de la función, todas las variables se moverán de la memoria de la stack, pero ¿cómo conserva la función el valor en la dirección ‘a’ e imprime los datos?

o / p:

  return from if a : 0xbfd8cf14 m ; 0xbfd8cf14 m : 20 

La dirección se conserva en el puntero m e imprime el valor correctamente. Intenté cambiar diferentes no’s.

Puede hacer que el valor de retorno sea “confiable” declarando static int a = -1; lo que haría a persistencia incluso después de que regreses de la función … pero esa es una idea muy mala en muchos casos … especialmente si vas a ser multiproceso.

Dicho esto … devolver un puntero a una variable temporal (local) causará esgulps en el tiempo de ejecución. Por lo tanto, nunca querrá hacer eso … necesita convertirlo en un local estático o encontrar una mejor manera de lidiar con él.

Extensión de la respuesta después de sus ediciones: cuando asigna -1 a a como una variable local, en realidad está almacenando -1 en una ubicación en la stack y &a apunta a esa ubicación. Cuando regresa de la función, la stack no se destruye, pero el comportamiento ahora no está definido porque aunque la dirección es un puntero válido, el contenido de esa dirección puede haber sido modificado … por ejemplo, si llama a otra función que inserta datos en la stack y / o declara variables locales, pueden haber sobrescrito el valor que esperaba. Además, quién sabe qué locura puede haber inyectado el optimizador. Entonces … podría funcionar si lees el valor antes que nada, no lo garantices … pero no tienes ninguna garantía de que funcione y con frecuencia variará de una implementación a otra.

Es que tu progtwig invoca un comportamiento indefinido. Es gratis imprimir cualquier cosa (o bloquearse, o hacer lo que quiera).

(Quizás esto es lo que realmente sucede: la “eliminación de la memoria” no significa que la memoria que contenía la variable se destruye, se incendia o desaparece por un mago. Es solo que se invalida. Dado que era una variable automática dentro de una función, lo más probable es que lo que sucedió es simplemente que el puntero de la stack se desplazó cuando la función regresó, dejando la variable inválida pero intacta. Sin embargo, no confíe en esto.)

El puntero devuelto no será válido después de salir de las funciones. Es un comportamiento indefinido.

El puntero conservado apunta a una posición en la memoria que ya no tiene permiso para leer / escribir en ella.

Para preservar la dirección válida, utilice static variable static .

 static int a = -1; // ... return &a; 

Es un comportamiento indefinido. Cuando abandona la función, la stack no se limpia, por lo que el valor real de la variable sigue ahí, pero se supone que no debe acceder a ella. Intenta llamar a otra función antes de mostrar el contenido de tu variable. Intenta comstackr con -O3 para un comportamiento posiblemente diferente.