3

所以我的教授给了我(xC 可执行文件在哪里):

$ ./x y z w

argv他说in的内存大小int main(int argc, char **argv)是48字节,包括它自己。

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

4

4 回答 4

4

argv正如函数所说,是一个指向 char 指针的指针,就大小而言,它是一个指针。通常(几乎总是但不保证?),所有指针的大小都相同。如果这是 64 位机器,则指针大小为 8 个字节。在本例中,argv包含五个元素:指向五个字符指针的指针:'./x'、'y'、'z'、'w' 和 NULL,因为argv是以 NULL 结尾的。

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

编辑:正如其他人所建议的,argv它本身也会占用指针空间,所以还有另外 8 个。

于 2011-12-19T15:47:55.020 回答
3

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

要理解的关键事项如下:

  1. 命令行参数作为空终止字符串传递给 C 程序
  2. argv[0]包含正在执行的程序的名称和/或路径
  3. argv[]是一个以 NULL 结尾的数组(argv[argc]始终为 NULL)
  4. argv是一个指针数组
  5. argv本身也是一个指针
于 2011-12-19T16:10:00.993 回答
3

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

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

于 2011-12-19T15:47:01.503 回答
2

argv 的大小正好是sizeof argv. 我怀疑你老师的电脑里是48。

参数:[| | | | | | | ] 指向 char* 类型值的指针
       \-------V--------/
               > argv[0]:[| | | | | | | ] 指向字符的指针 ==> [.|/|x|0]...
               > argv[1]:[| | | | | | | ] 指向字符的指针 ==> [y|0]...
               > argv[2]:[| | | | | | | ] 指向 char ==> [z|0]...
               > argv[3] : [ | | | | | | | ] 指向字符的指针 ==> [w|0]...
               > argv[4] : [0|0|0|0|0|0|0|0] 空指针

所以,至少 8 + 5*8 + 10 >= 58 字节

或者,如果您更喜欢 4 字节长的指针
至少 4 + 5*4 + 10 >= 34 字节
于 2011-12-19T15:56:39.513 回答