所以我的教授给了我(其中x
是C可执行文件):
$ ./x y z w
他说{{1}}中argv
的内存大小是48字节,包括它自己。
有人可以帮我解释一下吗?
答案 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程序,以及变量如何存储在内存中。内存的大小实际上只是用来说明这一点。
要理解的关键事项如下:
argv[0]
包含正在执行的程序的名称和/或路径argv[]
是以NULL结尾的数组(argv[argc]
始终为NULL)argv
是一个指针数组 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