C中argv的精确内存大小

时间:2011-12-19 15:38:38

标签: c argv

所以我的教授给了我(其中x是C可执行文件):

$ ./x y z w

他说{​​{1}}中argv的内存大小是48字节,包括它自己。

有人可以帮我解释一下吗?

4 个答案:

答案 0 :(得分:3)

有四个字符串,总共需要10个字节(包括空终止符)。 有五个指向字符串的指针(记住argv[4]存在且等于NULL),每个指针在64位平台上需要8个字节,因此需要40个字节。 还有argv本身,这是另外8个字节。

所以我总共计算了58个字节。 (这在32位平台上变为34个字节。)

答案 1 :(得分:3)

正如函数所说,

argv是指向char的指针,就大小而言,它指的是指针。通常(几乎总是但不保证?),所有指针都是相同的大小。如果这是一个64位机器,指针的大小将为8个字节。在这种情况下,argv包含五个元素:指向五个char指针的指针:'。/ x','y','z','w'和NULL,因为argv是NULL终止的

根据我的计算,在argv中留下40个字节,所以我不确定他在哪里得到其他8个。

编辑:正如别人建议的那样,argv本身也会占用指针空间,所以还有其他8位。

答案 2 :(得分:3)

除了技术问题之外,我认为您的教授希望帮助您了解如何将参数传递给您的C程序,以及变量如何存储在内存中。内存的大小实际上只是用来说明这一点。

要理解的关键事项如下:

  1. 命令行参数作为以null结尾的字符串
  2. 传递给C程序
  3. argv[0]包含正在执行的程序的名称和/或路径
  4. argv[]是以NULL结尾的数组(argv[argc]始终为NULL)
  5. argv是一个指针数组
  6. argv本身也是一个指针

答案 3 :(得分:2)

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