3

这是我的代码,我需要在此代码的输出中进行说明:

#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

因为我分配了两个不同的数组,所以这里的值的地址name1和不同的地址。name2但是在 and 的情况下name3name4地址是一样的,为什么不一样呢?它不会创建不同的内存并为值分配名称Chennai吗?为什么它指向同一个内存?

4

6 回答 6

5

该标准允许:

6.4.5 - 7

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

我的意思是,只要您不修改它们就没有关系,对吧?

于 2012-11-30T08:37:47.517 回答
0

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

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

于 2012-11-30T08:38:30.820 回答
0

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

于 2012-11-30T08:40:44.663 回答
0

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

该声明
char *name3= "Chennai";

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

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

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

于 2012-11-30T09:15:57.557 回答
0

字符串文字总是被设计为不可修改的。由于它们是不可修改的,因此允许它们共享空间并没有什么害处,因为一个字符串文字对象不能通过修改另一个字符串文字对象来改变。

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

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

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

于 2012-11-30T11:00:10.940 回答
0

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

于 2012-12-04T10:16:40.710 回答