Comment la mémoire est-elle allouée pour les variables de stack?

Sur VS (version), je lance ce qui suit:

int main(void) { char b[] = "123"; char a[] = "1234567"; printf("%x %x\n", b,a); return 0; } 

Je peux voir que l’adresse meme de a est b + 3 (la longueur de la chaine). Ce qui montre que la mémoire est allouée sans lacunes. Et cela garantit que moins de souvenirs sont utilisés. Donc, je crois maintenant que tous les compilateurs le feront. Je veux m’assurer de cette hypothèse ici. Quelqu’un peut-il me donner une preuve plus formelle ou me dire que mon hypothèse est basée sur une coïncidence?

Non, il n’est pas garanti qu’il y aura toujours un archivage parfait des données.

Par exemple, j’ai compilé et exécuté ce code sur g ++, et la différence est 8.

Vous pouvez en savoir plus à ce sujet ici .

tl; dr: les compilateurs peuvent aligner des objects en mémoire sur des adresses divisibles par une constante (toujours la longueur du mot machine) pour aider le processeur (pour eux, il est plus facile de travailler avec de telles adresses)

UPD: un exemple intéressant d’alignement:

 #include  using namespace std; struct A { int a; char b; int c; char d; }; struct B { int a; int c; char b; char d; }; int main() { cout << sizeof(A) << " " << sizeof(B) << "\n"; } 

Pour moi, ça imprime

 16 12 

Rien ne garantit quelles adresses seront choisies pour chaque variable. Différents processeurs peuvent avoir différentes exigences ou préférences pour l’alignement de variables, par exemple.

De plus, j’espère qu’il y a au moins 4 octets entre les adresses de votre exemple. "123" nécessite 4 octets, l’octet supplémentaire correspondant au terminateur nul.

Essayez d’inverser l’ordre de déclaration de [] et de b [] et / ou d’augmenter la longueur de b.

Vous faites une très grande hypothèse sur la façon dont le stockage est alloué. Selon votre compilateur, les littéraux de chaîne peuvent être stockés dans un pool de littéraux qui n’est PAS sur la stack. Pourtant, a [] et b [] occupent des éléments de la stack. Un autre test consisterait donc à append int c et à comparer ces adresses.