我需要一些帮助来理解在这种情况下如何执行内存分配。
char someStringPointer[100] = "hello world";
char *argv[3];
argv[0] = "echo";
argv[1] = someStringPointer;
argv[2] = NULL;
由于我没有分配内存,所以所有内容都将在堆栈上,因此这里没有分配堆内存。
但是我不确定堆栈上的内存是如何分配的。每个指针都是 8 个字节,所以假设 argv 位于(八进制)100。
因此 argv[0] 为 100,argv[1] 为 101,argv[2] 为 102。
argv[0] 现在将指向一个 5 字节的块,其中包含字符“echo”,当我使用赋值运算符“=”时,它会根据字符串的长度直接在堆栈上分配内存? (更准确地说是字符序列)。
argv[1] 将指向分配 someStringPointer 的位置。
argv[2] 我不确定,我猜它没有指向任何地方并设置为 null。
我很想了解这里的记忆是什么样的。
但是我不确定堆栈上的内存是如何分配的。每一个 指针是 8 个字节,所以假设 argv 位于(八进制)100。
因此 argv[0] 为 100,argv[1] 为 101,argv[2] 为 102。
如果每个指针占用
8
个字节,那么如果 atgv[0]
位于地址 100
,则 argv[1]
位于地址 108
,argv[2]
位于地址 116
。
在这个作业中
argv[0] = "echo";
使用了字符串文字
"echo"
,编译器通常将其存储在具有静态存储持续时间的文字池中。也就是说,在程序启动之前保留了文字的内存。
argv[1] 将指向分配 someStringPointer 的位置。
argv[1]
指向(存储地址)字符数组someStringPointer
的第一个字符。
argv[2] 我不确定,我猜它没有指向任何地方并设置为 null。
argv[2]
是一个空指针。它没有指向任何有效的对象。