在这个例子中似乎两个字符串“jesus”都是等号(相同的内存位置)。
printf("%p\n","jesus");
printf("%p\n","jesus");
另请注意:
printf("%p\n",&"jesus");
printf("%p\n","jesus");
打印相同,但是:
char* ptrToString = "jesus";
char* ptrToString = &"jesus"; //ERROR
所以我想知道一个未分配的字符串是如何存储在内存中的,以及如何指出它......
答案 0 :(得分:6)
首先,为什么"jesus"
和&"jesus"
相同:"jesus"
是一个类型为const char[6]
的数组,它会衰减到指向第一个元素的指针。获取数组的地址会为您提供指向数组的指针,其类型为const char (*)[6]
。但是,指向数组的指针在数字上与指向其第一个元素的指针相同(只有类型不同)。
这也解释了为什么你在最后一行有错误 - 类型类型是错误的。你需要:
const char (*pj)[6] = &"jesus";
最后,问题是重复的字符串文字是否具有相同的地址。这完全取决于编译器。如果它非常幼稚,它可以为源代码中每次出现的字符串文字存储一个单独的副本。如果它稍微聪明一点,它只会为每个字符串文字存储一个唯一的副本。字符串文字当然存储在某处的内存中,通常存储在程序映像的只读数据段中。将它们视为静态初始化的全局变量。
还有一件事:您的原始代码实际上是未定义的行为,因为%p
需要void *
参数,而不是const char *
或{{1 }}。所以正确的代码是:
const char (*)[6]
答案 1 :(得分:1)
C是一种精心指定的语言,我们可以对您的示例做出很多观察,可以回答一些问题。
array of char
。nul
字节可以嵌入\0
。为了使最后一行有效,您需要:
char (*ptrToString)[] = &"jesus"; // now not an ERROR