2011-03-11 7 views
5
char *xyz() 
{ 
    char str[32]; 
    strcpy(str,"Hello there!"); 
    return(str); 
} 


void main() 
{ 
    printf("%s",xyz()); 
} 

Lorsque j'appelle xyz(), est-ce qu'il va retourner un pointeur? MerciC pointeur pointeur question

+5

** OUI ** 1234567 – pmg

Répondre

11

Oui, c'est un pointeur qui pend. Votre programme appelle un comportement indéfini.

Sur certains systèmes, il se peut que votre application plante, d'autres semblent fonctionner correctement. Mais de toute façon, vous ne devriez pas le faire.

4

Il retournera en effet un pointeur qui pend.

4

Oui. En général ce que vous essayez de faire est découragé en général, mais si vous avez besoin de le faire faire à la place:

static char str[32]; 

qui assurera qu'il reste autour après la sortie de fonction.

+0

Ce n'est pas vraiment une solution générale. –

2

OUI! il va retourner le pointeur sur "Bonjour!" mais depuis que le xyz() a libéré cette mémoire, vous ne pouvez pas être sûr que la chaîne est toujours là, donc elle sera pointée!

5

Oui, il va générer une erreur pointeur pendante. Lorsque vous appelez xyz(), 32 * sizeof (char) octets seront alloués sur la pile dans le cadre de la pile de xyz. Lorsque vous travaillez dans xyz(), vous modifiez et travaillez sur ces octets qui ont été alloués sur la pile. L'appel de retour (str) utilise le nom de tableau str en tant que pointeur, vous renvoyez donc l'adresse au tableau str. Une fois que vous avez retourné, le cadre de pile pour xyz est déroulé, et l'emplacement de mémoire locale que xyz avait pour str n'est plus valide.

Dans votre fonction principale, la valeur de retour de xyz() (l'adresse de l'ancienne variable locale str dans le cadre de la pile xyz) est maintenant passée à une autre fonction, printf. Lorsque printf génère son propre cadre de pile, il écrira en fait sur la mémoire précédemment utilisée pour stocker str dans xyz() (puisque c'est la prochaine mémoire disponible sur la pile).