Char *共享相同的内存

时间:2012-11-30 08:36:03

标签: c gcc

这是我的代码,我需要澄清此代码的输出:

#include <stdio.h>
int main(void )
{
char name1[10] = "Rajan" , name2[10] = "Rajan" ;
char *name3 = "Chennai" , *name4 = "Chennai" ;
printf("\nAddress for name1 and name2 : %p and %p",name1,name2) ;
printf("\nAddress for name3 and name4 : %p and %p",name3,name4) ;
return 0 ;
}

此代码的输出是

Address for name1 and name2 : 0x7fff9e6cbe10 and 0x7fff9e6cbe20
Address for name3 and name4 : 0x400760 and 0x400760

这里值name1name2的地址不同,因为我分配了两个不同的数组。但是在name3name4的情况下,地址是相同的,为什么它没有不同?它不会创建不同的内存并为值Chennai分配名称?为什么它指向同一个内存?

6 个答案:

答案 0 :(得分:5)

标准允许:

  

6.4.5 - 7

     

未提供这些数组是否不同   他们的元素具有适当的值。如果是程序   试图修改这样的数组,行为是未定义的。

我的意思是,只要你不修改它们就没关系了,对吗?

答案 1 :(得分:0)

因为它们是常量内存的char *。您不能更改name3或name4指向的字符串,但您可以更改name1和name2指向的字符串,因为name1和name2正在分配内存,然后将名称“Rajan”初始化到该内存中。

你可以让name3或name4指向其他东西。但是目前,你已经说过将它指向一个const字符串(并且它不会复制那些const字符串....你还会发现它将另一个const字符串存储到它用于初始化name1的“Rajan”和name2

答案 2 :(得分:0)

“Chennai”是一个const,name3和name4指向同一个地方。

答案 3 :(得分:0)

编译程序时,编译器会形成目标代码文件,其中包含机器代码和程序中声明的所有字符串常量的表。

声明
char *name3= "Chennai";

使name3指向字符串常量表中字符串“Chennai”的地址。同样适用于name4。所以name3和name4都指向相同的地址。

由于此字符串位于字符串常量表中,因此在技术上是可执行代码的一部分,因此无法对其进行修改。您只能指向它并以只读方式使用它。

http://euklid.mi.uni-koeln.de/c/mirror/mickey.lcsc.edu/%257Esteve/c13.html提供了有关如何在C中处理字符串的更多信息。

答案 4 :(得分:0)

字符串文字始终是不可修改的。由于它们是不可修改的,因此允许它们共享空间没有任何害处,因为一个字符串文字对象不能通过修改另一个来改变。

但是,最初C中不存在const属性,因此该语言必须允许将指向字符串文字的指针分配给普通(非常量)指针。为了保持与旧代码的兼容性,C标准仍允许将字符串文字分配给非常量指针。但你不能试图修改它们。

如果重新创建C,字符串文字可能会生成带有const属性的指针。

(用于初始化数组的字符串文字是特殊的;在那里,字符串文字基本上只是对数组放入内容的编译时规范。它们没有可以分配给指针的地址。)

答案 5 :(得分:0)

name3和name4是字符串文字,将存储在只读内存中,您无法修改字符串文字中的每个字符。你试图在指针中存储相同的字符,以便优化内存分配你的字符串“chennai”只在只读地址中获取一次内存,而name3和name4将指向相同的地址。您可以更改name1和name2中的每个字符,以便为两者提供不同的地址