Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
argv在C中的精确内存大小_C_Argv - Fatal编程技术网

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