Je suis tombé sur de nombreuses fonctions renvoyant des pointeurs char dans une application héritée. Certains d'entre eux retournent des pointeurs vers des tableaux de caractères locaux. Il semble causer des accidents après plusieurs invocations (pas tout de suite!) Voir l'utilisation ci-dessousfonctions renvoyant pointeur char
char *f1(){
char buff[20];
char *ptr;
----
----
ptr=buff;
return ptr;
}
---
---
f2(f1());
f1() retourne une variable locale de pointeur, puis passe à une autre fonction. J'ai eu l'accident directement quand il est compilé en utilisant le mode _DEBUG dans MS DEV. Mais en mode release, il ne provoque pas un crash immédiat, mais il peut se produire après avoir fait beaucoup d'appels de ce type.
Lorsque j'ai modifié l'utilisation comme ci-dessous, cela fonctionne sans aucun problème. L'utilisation suivante est-elle sûre?
strcpy(arr,f1()); /* arr is fixed char array*/
f2(arr);
+1 à peu près tout. – Tom
Et la raison pour laquelle cela arrive est que sur le x86 le tableau buff est rempli depuis les adresses les plus basses vers les adresses plus élevées et ne sera probablement pas touché par l'utilisation de la pile de strcpy. Ne le faites pas de toute façon: l'utilisation de la pile peut varier en raison d'événements asynchrones tels que les signaux et les interruptions. –