Pour les chaînes droites C et GCC, pourquoi la chaîne pointée n'est-elle pas corrompue ici?C Portée de chaîne affectée par une pile
#include <stdio.h>
int main(int argc, char *argv[])
{
char* str_ptr = NULL;
{
//local to this scope-block
char str[4]={0};
sprintf(str, "AGH");
str_ptr = str;
}
printf("str_ptr: %s\n", str_ptr);
getchar();
return 0;
}
| ---- SORTIE ----- |
str_ptr: AGH
| -------------------- |
Voici a link au code ci-dessus compilé et exécuté en utilisant un compilateur en ligne. Je comprends que si str
était un littéral de chaîne, str
serait stocké dans le bss (essentiellement statique), mais sprintf (ing) dans un tampon alloué par pile, je pensais que le tampon de chaîne serait purement stack- basé (et donc l'adresse sans signification après avoir quitté le bloc de portée)? Je comprends qu'il peut prendre des allocations de pile supplémentaires pour écraser la mémoire à l'adresse donnée, mais même en utilisant une fonction récursive jusqu'à un dépassement de pile, je n'ai pas pu corrompre la chaîne pointée par str_ptr
.
FYI Je fais mes tests dans un projet VS2008 C, bien que GCC semble avoir le même comportement.
Ce code n'est pas C90. –