Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么两个指针显示相同的内存地址_C_Arrays_Pointers_Memory - Fatal编程技术网

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

C 为什么两个指针显示相同的内存地址,c,arrays,pointers,memory,C,Arrays,Pointers,Memory,我正在初始化这个指针数组 但当我尝试访问指针数组的每个成员时,我可以看到 选项[0]=数据[3] 0x40873b=0x40873b 它们都指向相同的内存位置 甚至我也在“数据”数组之前声明了“选项”数组。 那么如何解决这个问题呢。 如何确保它们位于不同的内存位置并正确存储内容。在不重叠的情况下,不同的数据位于两个不同的位置。当您写入时 ..... // Some code char *options[] = {"\nDATA:","\nSUBJECT:","\nMAILFROM:","\nRC

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

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

甚至我也在“数据”数组之前声明了“选项”数组。 那么如何解决这个问题呢。 如何确保它们位于不同的内存位置并正确存储内容。在不重叠的情况下,不同的数据位于两个不同的位置。

当您写入时

.....
// 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]
指向相同的内存位置吗?