所以我的教授给了我(x
C 可执行文件在哪里):
$ ./x y z w
argv
他说in的内存大小int main(int argc, char **argv)
是48字节,包括它自己。
有人可以帮我解释一下吗?
argv
正如函数所说,是一个指向 char 指针的指针,就大小而言,它是一个指针。通常(几乎总是但不保证?),所有指针的大小都相同。如果这是 64 位机器,则指针大小为 8 个字节。在本例中,argv
包含五个元素:指向五个字符指针的指针:'./x'、'y'、'z'、'w' 和 NULL,因为argv
是以 NULL 结尾的。
根据我的计算,剩下 40 个字节argv
,所以我不确定他从哪里得到其他 8 个字节。
编辑:正如其他人所建议的,argv
它本身也会占用指针空间,所以还有另外 8 个。
抛开技术答案不谈,我认为您的教授希望帮助您了解参数是如何传递给您的 C 程序的,以及变量是如何存储在内存中的。内存的大小实际上只是用来说明这一点。
要理解的关键事项如下:
argv[0]
包含正在执行的程序的名称和/或路径argv[]
是一个以 NULL 结尾的数组(argv[argc]
始终为 NULL)argv
是一个指针数组argv
本身也是一个指针有四个字符串,总共需要 10 个字节(包括空终止符)。有五个指向字符串的指针(记住argv[4]
存在并且等于NULL
),每个在 64 位平台上需要 8 个字节,所以是 40 个字节。还有argv
本身,也就是另外8个字节。
所以我总共计算了 58 个字节。(这在 32 位平台上变为 34 字节。)
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 字节