char* 数组中不同大小的元素

问题描述 投票:0回答:1

我需要一些帮助来理解在这种情况下如何执行内存分配。

 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。

我很想了解这里的记忆是什么样的。

arrays c pointers initialization
1个回答
1
投票

但是我不确定堆栈上的内存是如何分配的。每一个 指针是 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]
是一个空指针。它没有指向任何有效的对象。

© www.soinside.com 2019 - 2024. All rights reserved.