argv在C中的精确内存大小
所以我的教授给了我(其中argv在C中的精确内存大小,c,argv,C,Argv,所以我的教授给了我(其中x是一个C可执行文件): 他说intmain(intargc,char**argv)中argv的内存大小是48字节,包括它本身 有人能帮我解释一下吗?有四个字符串,总共需要10个字节(包括空终止符)。 有五个指向字符串的指针(请记住,argv[4]存在并且等于NULL),每个指针在64位平台上需要8个字节,因此需要40个字节。 还有另一个8字节的argv本身 所以我总共计算了58个字节。(在32位平台上变为34字节。)argv正如函数所说,是指向字符指针的指针,就大小而言
x
是一个C可执行文件):
他说intmain(intargc,char**argv)
中argv
的内存大小是48字节,包括它本身
有人能帮我解释一下吗?有四个字符串,总共需要10个字节(包括空终止符)。 有五个指向字符串的指针(请记住,
argv[4]
存在并且等于NULL
),每个指针在64位平台上需要8个字节,因此需要40个字节。
还有另一个8字节的argv
本身
所以我总共计算了58个字节。(在32位平台上变为34字节。)
argv
正如函数所说,是指向字符指针的指针,就大小而言,意味着它是指针。通常(几乎总是但不保证?),所有指针的大小都相同。如果这是一台64位机器,指针的大小将为8字节。在本例中,argv
包含五个元素:指向五个字符指针的指针:'./x',y',z',w',和NULL,因为argv
以NULL结尾
根据我的计算,这在argv中留下了40个字节,所以我不确定他从哪里得到了另外8个字节
Edit:正如其他人建议的那样,
argv
本身也会占用指针的空间,所以还有另外8个。argv的大小正好是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
argv:[| | | | | | |]指向char类型值的指针*
\-------五-------/
>argv[0]:[| | | | | | | |]指向char==>[.|/| x | 0]的指针。。。
>argv[1]:[| | | | | | |]指向char==>[y | 0]的指针。。。
>argv[2]:[| | | | | | |]指向char==>[z | 0]的指针。。。
>argv[3]:[| | | | | | |]指向char的指针==>[w | 0]。。。
>argv[4]:[0 | 0 | 0 | 0 | 0 | 0 | 0]空指针
因此,至少8+5*8+10>=58字节
或者,如果您更喜欢4字节长的指针
至少4+5*4+10>=34字节
撇开技术上的回答不谈,我认为你们的教授想帮助你们理解参数是如何传递给C程序的,变量是如何存储在内存中的。内存的大小实际上只是用来说明这一点
需要了解的关键内容如下:
命令行参数作为以null结尾的字符串传递给C程序
argv[0]
包含正在执行的程序的名称和/或路径
argv[]
是以NULL结尾的数组(argv[argc]
始终为NULL)
argv
是指针数组
argv
本身也是一个指针
添加了家庭作业标签。请澄清一下这个问题,有人能解释一下每个字母x,y,z,w的字节大小吗?argv本身包含四个参数[the./x counts],最后加上一个空指针,所以是5*P,其中P是指针的大小。字符串数据本身至少需要10个字节-4+2+2+2[每个字符串末尾需要一个空字节]。这不可能导致48人死亡。在32位系统上为30,在64位系统上为50。argv
的大小等于sizeof(char**)
,通常等于(且永远不大于)sizeof(void*)
。我想你(或你的教授)实际上是指别的意思;argv本身的内存开销,而不是用于存储字符串的内存。
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