Точный объем памяти argv в C - PullRequest
       7

Точный объем памяти argv в C

3 голосов
/ 19 декабря 2011

Итак, мой профессор дал мне (где x - исполняемый файл C):

$ ./x y z w

Он сказал, что объем памяти argv в int main(int argc, char **argv) составляет 48 байт, включая самого себя.

Может кто-нибудь помочь мне это объяснить?

Ответы [ 4 ]

3 голосов
/ 19 декабря 2011

Помимо технических ответов, я думаю, что ваш профессор хочет помочь вам понять , как аргументы передаются в вашу C-программу, и как переменные хранятся в памяти.Размер памяти на самом деле используется только для иллюстрации этой точки.

Ключевые моменты, которые необходимо понять, таковы:

  1. Аргументы командной строки передаются программе C как нулевыестроки
  2. argv[0] содержат имя и / или путь к исполняемой программе
  3. argv[] массив с нулевым символом в конце (argv[argc] всегда NULL)
  4. argv - это массив указателей
  5. argv, сам по себе также является указателем
3 голосов
/ 19 декабря 2011

argv - это, как говорит функция, указатель на указатель на символ, который с точки зрения размера означает, что это указатель. Как правило (почти всегда, но не гарантировано?), Все указатели имеют одинаковый размер. Если это 64-битная машина, указатели будут иметь размер 8 байт. В этом случае argv содержит пять элементов: указатели на пять указателей на символы: './x', 'y', 'z', 'w' и NULL, поскольку argv имеет нулевое окончание.

По моим подсчетам, это оставляет 40 байт в argv, поэтому я не уверен, где он получает остальные 8.

Редактировать: Как кто-то еще предположил, argv сама также заняла бы место для указателя, так что есть другие 8.

3 голосов
/ 19 декабря 2011

Есть четыре строки, требующие в общей сложности 10 байтов (включая нулевые терминаторы). Есть пять указателей на строки (помните, что argv[4] существует и равен NULL), каждый из которых требует 8 байтов на 64-битной платформе, то есть 40 байтов. Существует также argv, что составляет еще 8 байтов.

Итак, я считаю 58 байт. (Это становится 34 байта на 32-битной платформе.)

2 голосов
/ 19 декабря 2011

Размер argv точно равен sizeof argv. Я сомневаюсь, что на компьютере твоего учителя 48.

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
...