【发布时间】:2013-12-25 17:40:31
【问题描述】:
这个板子似乎充满了这类问题,我确实回答了其中一些,但我仍然对这两者之间的区别感到困惑:
char string[] = "Hello";
char * string2 = "hello";
现在,
char string[] = "Hello";
... 是一个数组,分配了 6 个连续的内存地址空间来存储字符,包括末尾的 \0。
&string 的%p 显示内存地址 0x7fffbcabce90。 string 的 %p 显示相同的内存地址 0x7fffbcabce90。 string[1] 的 %p 显示 0x7fffbcabce90 + typeof(char),所以 0x7fffbcabce91。等等
char * string2 = "hello";
...是一个char类型的指针,它指向字符串(h)第一个字符的内存地址。
&string2 的%p 显示内存地址 0x7fffbcabce88。 string2 的 %p 显示不同的内存地址 0x400ca8。 string2[1] 的 %p 显示 0x400ca8 + sizeof(char),所以 0x400ca9。
我的问题是:这个内存地址范围是多少(0x400000)?难道是我不能像这样修改字符串字符的原因吗?:
string[1] = 'c'; //that works
string2[1] = 'c'; //not working
谢谢!
编辑:错字 (%string2 => &string2)
Edit2:正如向我解释的那样,关键字是字符串literal。
char * string2[] = "Hello";
... 是指向字符串文字的指针。这是一个线程,其中 R Samuel Klatchko 解释了将文字存储在内存中的位置:
【问题讨论】:
-
顺便说一句,我无法想象您还没有找到可以理解这一点的单个副本。我记得自己多次解释过这一点。
-
@H2CO3 能否请您给我一个示例来解释该内存地址范围?两个 cmets 吼道,你在告诉我:“@ChibiSlick 我不知道。你也不应该担心这个。 - 1 分钟前的 H2CO3。”你困惑吗? :)
-
不,我不困惑,但这不再是 C。您正在询问系统的实施细节。而且我不擅长低级的东西,所以我不知道为什么链接器选择那个地址或者为什么
0x4000000是只读的。
标签: c memory linker operating-system