繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM