为什么两个指针都显示相同的内存地址

时间:2015-11-04 13:55:06

标签: c arrays pointers memory

.....
// Some code
char *options[] = {"\nDATA:","\nSUBJECT:","\nMAILFROM:","\nRCPTO:"};
char *data[3] = {};

我正在初始化这个指针数组。

但是当我尝试访问指针数组的每个成员时,我可以看到 选项[0] =数据[3]    0x40873b = 0x40873b 它们都指向相同的内存位置。

即使我在'data'数组之前声明了'options'数组。 那么如何解决这个问题。 如何确保它们位于不同的内存位置并正确存储内容。在两个不同的位置没有重叠的不同数据。

2 个答案:

答案 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数组(如上所示),尽管这只会在这种特定情况下“起作用”;如果添加另一个变量或更改代码,编译器可能会更改内存中布局内容的顺序,这将突然不再“起作用”。