2011-03-11 11 views

Respuesta

11

Sí, es un puntero colgante. Su programa invoca un comportamiento indefinido.

En algunos sistemas, puede bloquear su aplicación, en otros puede parecer que funciona correctamente. Pero de cualquier manera, no deberías hacerlo.

4

De hecho devolverá un puntero colgando.

4

Sí. En general, lo que estamos tratando de hacer no se recomienda en general, pero si usted tiene que hacer que hacer esto en su lugar:

static char str[32]; 

que se asegurará de que se mantiene alrededor después se cierra la función.

+0

No es realmente una solución general. –

2

¡SÍ! devolverá el puntero a "¡Hola!" pero como el xyz() liberó esa memoria, no puedes estar seguro de que la cadena aún esté allí, ¡así que estará colgando el puntero!

5

Sí, generará un error de puntero colgando.

Cuando llame a xyz(), se asignarán 32 * sizeof (char) bytes en la pila dentro del marco de pila de xyz. Cuando trabajas dentro de xyz(), estás modificando y trabajando en estos bytes que han sido asignados en la pila.

La llamada de retorno (str) utiliza el nombre de la matriz str como un puntero, por lo que en realidad está devolviendo la dirección a la matriz str. Una vez que haya regresado, se desenrollará el marco de pila para xyz, y la ubicación de la memoria local que xyz tenía para str ya no es válida.

De vuelta en su función principal, el valor de retorno de xyz() (la dirección a la antigua variable local str en el marco de la pila xyz) ahora se pasa a otra función, printf. Cuando printf genera su propio marco de pila, en realidad estará escribiendo sobre la memoria que se utilizó anteriormente para almacenar str en xyz() (ya que esa es la próxima memoria disponible en la pila).