![](/img/trans.png)
[英]Why doesn't the following work even though they both pointers point to the same address?
[英]Why both the pointers show same memory address
.....
// Some code
char *options[] = {"\nDATA:","\nSUBJECT:","\nMAILFROM:","\nRCPTO:"};
char *data[3] = {};
我正在初始化这个指针数组。
但是当我尝试访问指针数组的每个成员时,我可以看到 options[0] = data[3] 0x40873b = 0x40873b 它们都指向相同的内存位置。
即使我在 'data' 数组之前声明了 'options' 数组。 那么如何解决这个问题。 如何确保它们位于不同的内存位置并正确存储内容。没有重叠,不同的数据位于 2 个不同的位置。
当你写
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
的第一个内容的地方。
看起来编译器将您的对象布置如下:
+---+
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 *
)。 理论上,您可以使用data
(如上所示)遍历整个options
数组,尽管这仅在这种特定情况下“有效”; 如果您添加另一个变量或更改代码,编译器可能会更改内容在内存中的排列顺序,这将突然不再“工作”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.