2011-12-19 7 views
3

Donc, mon professeur m'a donné (où x est un exécutable C):mémoire exacte Taille de argv en C

$ ./x y z w 

Il a dit la taille de la mémoire de argv en int main(int argc, char **argv) est de 48 octets, y compris lui-même.

Quelqu'un peut-il m'aider à m'expliquer cela?

+0

tag de travail. S'il vous plaît clarifier un peu la question –

+3

Que voulez-vous dire exactement? – ArjunShankar

+0

quelqu'un peut-il expliquer la taille en octets de chaque lettre, x, y, z, w? – yking

Répondre

3

Il existe quatre chaînes, nécessitant un total de 10 octets (y compris les terminaisons NULL). Il existe cinq pointeurs sur les chaînes (rappelez-vous que argv[4] existe et est égal à NULL), chacune nécessitant 8 octets sur une plate-forme 64 bits, soit 40 octets. Il y a aussi argv lui-même, qui est un autre 8 octets.

Donc je compte 58 octets au total. (Cela devient 34 octets sur une plate-forme 32 bits.)

3

argv est, comme le dit la fonction, un pointeur vers un pointeur, ce qui en termes de taille signifie qu'il s'agit d'un pointeur. Généralement (presque toujours mais pas garanti?), Tous les pointeurs ont la même taille. S'il s'agit d'une machine 64 bits, les pointeurs auront une taille de 8 octets. Dans ce cas, argv contient cinq éléments: des pointeurs vers cinq pointeurs char: './x', 'y', 'z', 'w' et NULL, car argv est terminé par NULL.

Par mes calculs, qui laisse 40 octets dans argv, donc je ne sais pas où il se l'autre 8.

Edit: Comme quelqu'un d'autre a suggéré, argv se serait également prendre de la place pour une pointeur, donc il y a l'autre 8.

+0

+1 Je pense que c'est très probablement ce que le professeur voulait dire; la surcharge mémoire de 'argv' elle-même, pas la mémoire utilisée pour stocker les chaînes. –

2

La taille de argv est exactement sizeof argv. Je doute que ce soit 48 dans l'ordinateur de votre professeur.

 
argv : [ | | | | | | | ] pointer to values of type char* 
     \-------V-------/ 
       > argv[0] : [ | | | | | | | ] pointer to char ==> [.|/|x|0]... 
       > argv[1] : [ | | | | | | | ] pointer to char ==> [y|0]... 
       > argv[2] : [ | | | | | | | ] pointer to char ==> [z|0]... 
       > argv[3] : [ | | | | | | | ] pointer to char ==> [w|0]... 
       > argv[4] : [0|0|0|0|0|0|0|0] NULL pointer 

So, at least 8 + 5*8 + 10 >= 58 bytes 

Or, if you prefer pointers 4-bytes long 
at least 4 + 5*4 + 10 >= 34 bytes 
3

réponses techniques mises à part, je pense que votre professeur veut vous aider à comprendre comment arguments sont passés à votre programme C, et la façon dont les variables sont stockées dans la mémoire. La taille de la mémoire est vraiment juste utilisée pour illustrer le point.

Les éléments clés pour comprendre sont les suivantes:

  1. arguments de ligne de commande sont passés à un programme C sous forme de chaînes terminées par null
  2. argv[0] contient le nom et/ou le chemin du programme qui est en cours d'exécution
  3. argv[] est un tableau terminé par NULL (argv[argc] est toujours NULL)
  4. argv est un tableau de pointeurs
  5. argv lui-même est également un pointeur
+0

Merci à tous pour votre aide !! – yking