2

在这个例子中,两个字符串“jesus”似乎是相等的(相同的内存位置)。

printf("%p\n","jesus");
printf("%p\n","jesus");

另请注意:

printf("%p\n",&"jesus");
printf("%p\n","jesus");

打印相同,但是:

char* ptrToString = "jesus";
char* ptrToString = &"jesus"; //ERROR

所以我想知道未分配的字符串如何存储在内存中以及如何指向它......

4

2 回答 2

6

"jesus"首先,为什么是&"jesus"相同的:"jesus"是一个类型的数组const char[6],它衰减为指向第一个元素的指针。获取数组的地址会给你一个指向数组的指针,它的类型是const char (*)[6]。但是,指向数组的指针在数值上与指向其第一个元素的指针相同(只是类型不同)。

这也解释了为什么最后一行有错误 - 类型类型错误。你需要:

 const char (*pj)[6] = &"jesus";

最后,问题是重复的字符串文字是否具有相同的地址。这完全取决于编译器。如果它非常幼稚,它可以为源代码中每次出现的字符串文字存储一个单独的副本。如果它稍微聪明一点,它只会为每个字符串文字存储一个唯一的副本。字符串文字当然存储在内存中的某个地方,通常存储在程序映像的只读数据段中。将它们视为静态初始化的全局变量。

还有一件事:您的原始代码实际上是undefined behavior,因为%p需要一个void *参数,而不是 aconst char *或 a const char (*)[6]。所以正确的代码是:

printf("%p\n%p\n", (void const *)"jesus", (void const *)&"jesus");
于 2012-05-12T18:01:18.623 回答
1

C 是一种经过仔细指定的语言,我们可以对您的示例进行许多观察,以回答一些问题。

  1. 字符文字作为初始化数据存储在内存中。他们有类型array of char
  2. 它们不一定是字符串,因为nul字节可以嵌入\0.
  3. 不要求相同的字符串文字必须是唯一的,但是如果程序尝试修改字符串文字会发生什么,这是未定义的。这有效地允许它们在实现认为合适时是不同的或“实习的”。
  4. 为了使最后一行工作,您需要:

    char (*ptrToString)[] = &"jesus"; // now not an ERROR

于 2012-05-12T18:12:53.080 回答