.....
// Some code
char *options[] = {"\nDATA:","\nSUBJECT:","\nMAILFROM:","\nRCPTO:"};
char *data[3] = {};
我正在初始化这个指针数组。
但是当我尝试访问指针数组的每个成员时,我可以看到 选项[0] =数据[3] 0x40873b = 0x40873b 它们都指向相同的内存位置。
即使我在'data'数组之前声明了'options'数组。 那么如何解决这个问题。 如何确保它们位于不同的内存位置并正确存储内容。在两个不同的位置没有重叠的不同数据。
答案 0 :(得分:1)
写作时
char *data[3] = {};
[3]
表示“为数组的三个元素分配空间”。
这并不意味着您刚刚创建了一个名为的指针
data[3]
(实际上data[3]
不是指针)
也不是data[3]
是记忆的一部分
刚分配;而是分配给内存的三个元素
数组是data[0]
,data[1]
和data[2]
,
位于内存位置data
(0x408738),
data + 1
(0x408739)和data + 2
(0x40873a)。
如果你写
data[3] == options[0]
然后data[3]
表示内存位置data + 3
处的内容,
在最后分配的data
元素之后的第一件事。
编译器恰好已经启动了内存分配
对于那里的options
,也就是说,位置0x40873b就在哪里
首先找到options
的内容。
答案 1 :(得分:1)
它看起来就像编译器把你的对象放在一样,如下所示:
+---+
data: | | data[0]
+---+
| | data[1]
+---+
| | data[2] <-- last element of data array
+---+
options: | | options[0], data[3]
+---+
| | options[1], data[4]
+---+
| | options[2], data[5]
+---+
| | options[3], data[6] <-- last element of options array
+---+
您的data
数组包含3个元素,索引范围为0到2.当您访问data[3]
时,您正在访问一个超过data
数组末尾的对象,并且它恰好成为options
数组的第一个对象。
请注意,尝试读取一个超过数组末尾的对象会调用未定义的行为; C不会对数组访问进行任何边界检查,因此这样做不会引发OutOfBounds异常或类似的事情。在这种特殊情况下,您有一个看似合理的值,因为data
数组的最后一个元素后面的对象与该元素(char *
)的类型相同。理论上,您可以使用options
遍历整个data
数组(如上所示),尽管这只会在这种特定情况下“起作用”;如果添加另一个变量或更改代码,编译器可能会更改内存中布局内容的顺序,这将突然不再“起作用”。