C 为什么两个指针显示相同的内存地址
我正在初始化这个指针数组 但当我尝试访问指针数组的每个成员时,我可以看到 选项[0]=数据[3] 0x40873b=0x40873b 它们都指向相同的内存位置 甚至我也在“数据”数组之前声明了“选项”数组。 那么如何解决这个问题呢。 如何确保它们位于不同的内存位置并正确存储内容。在不重叠的情况下,不同的数据位于两个不同的位置。当您写入时C 为什么两个指针显示相同的内存地址,c,arrays,pointers,memory,C,Arrays,Pointers,Memory,我正在初始化这个指针数组 但当我尝试访问指针数组的每个成员时,我可以看到 选项[0]=数据[3] 0x40873b=0x40873b 它们都指向相同的内存位置 甚至我也在“数据”数组之前声明了“选项”数组。 那么如何解决这个问题呢。 如何确保它们位于不同的内存位置并正确存储内容。在不重叠的情况下,不同的数据位于两个不同的位置。当您写入时 ..... // Some code char *options[] = {"\nDATA:","\nSUBJECT:","\nMAILFROM:","\nRC
.....
// Some code
char *options[] = {"\nDATA:","\nSUBJECT:","\nMAILFROM:","\nRCPTO:"};
char *data[3] = {};
char *data[3] = {};
[3]
表示“为数组的三个元素分配空间”。
这并不意味着您刚刚创建了一个名为
数据[3]
(实际上数据[3]
不是指针)
也不是数据[3]
是被删除的内存的一部分
刚刚分配;相反,内存的三个元素分配给
数组是数据[0]
、数据[1]
和数据[2]
,
位于存储位置数据(0x408738),
数据+1
(0x408739)和数据+2
(0x40873a)
如果你写信
.....
// Some code
char *options[] = {"\nDATA:","\nSUBJECT:","\nMAILFROM:","\nRCPTO:"};
char *data[3] = {};
char *data[3] = {};
然后data[3]
表示内存位置data+3
中的任何内容,
在数据的最后一个分配元素之后的第一件事是什么。
编译器碰巧已开始内存分配
对于选项
,即位置0x40873b是
可以找到选项的第一个内容。看起来编译器将对象布局如下:
data[3] == options[0]
+---+
数据:| |数据[0]
+---+
||数据[1]
+---+
||数据[2]数据[3]
超出范围。数组只有索引0、1和2。即使此程序不包含上述未定义的行为错误,也可能最终导致两个指针指向同一位置,因为它们是指向无法修改的常量字符串文本的指针。如果您的程序中有两个这样的文本,它们都是“hello”
,然后用唯一指针指向每个文本,那么这两个文本仍可能被分配到相同的内存地址,因为编译器可以判断它们是相同的,并且它们是只读的。这是一个名为“字符串池”的编译器优化。上面所说的一切都是可以理解的。但是这个问题的解决方案叫“字符串池”?@user1421147:Lundin描述的“字符串池”不是问题;可以让多个指针指向同一个字符串文字,因为字符串文字应该是不可变的。但是,如果您想拥有同一字符串的多个副本,则需要为每个副本分配内存,例如char*copy=malloc(strlen(str)+1);如果(复制)strcpy(复制,str)代码>我想要的是我的字符串数据不应该重叠。我希望数据[3]和选项[0]存储不同的数据,而不是指向同一内存位置。我可以控制在哪个内存位置存储哪些数据吗?@user1421147:正如当前声明的那样,data[3]
已超过data
数组的末尾(索引为0、1和2的3个元素)。你不应该试图在那里储存任何东西。您的意思是不希望数据[2]
和选项[0]
指向相同的内存位置吗?