2017-08-28 5 views
-1
#include<stdio.h> 
int main() 
{ 
    char str[10]; 
    printf("The address of string is %x", str); 
    return; 
} 

Chaque fois que j'exécute le programme, la même adresse mémoire apparaît. Pourquoi est-ce si? Quand la mémoire est-elle attribuée?Quand l'adresse d'une chaîne est-elle allouée?

+2

pouvez-vous me dire pourquoi vous pensez que ce ne devrait pas être ainsi? –

+1

Ceci est totalement spécifique à l'implémentation. –

+0

Les variables de pile sont attribuées dès que la fonction est appelée ou que le bloc de defitnition est entré. BTW: 'main' devrait retourner une certaine valeur. Pour imprimer une adresse, le spécificateur de format '% p' doit être utilisé et l'adresse doit être convertie en' (void *) '. – Gerhardh

Répondre

0

Comme votre str a champ de fonction et pas spécificateur de classe de stockage, il a durée de stockage automatique par défaut. Cela signifie qu'il existe tant que l'exécution ne sort pas de sa portée (la fonction main()). La réponse à votre question est la suivante: L'implémentation doit réserver de la mémoire pour cette variable chaque fois que main() est entré. Mais la mise en œuvre serait toujours libre de le faire plus tôt, car cela ne conduirait pas à un comportement observable différent.

En ce qui concerne votre autre question, il n'y a rien dans la spécification de C vous dire quelque chose sur les adresses. Très probablement, votre implémentation utilise une pile d'appels pour stocker les variables locales (automatiques) et dans votre système, cette pile d'appels est toujours située à la même adresse virtuelle. Mais c'est une supposition, une implémentation peut faire ce qu'elle veut.

0

Tout d'abord, votre programme provoque undefined behavior.

Vous devez utiliser %p pour imprimer des pointeurs. En outre, si FWIW, si l'argument fourni est autre qu'un pointeur de caractères, vous devez convertir le même à void *. Cela dit, l'allocation de mémoire dépend de l'implémentation. La norme C n'impose rien concernant le schéma d'attribution des plages d'adresses.