未分配的字符串如何存储在内存中以及如何引用它?

nEA*_*nam 1 c string pointers reference char

在这个例子中似乎两个字符串"jesus"都是等号(相同的内存位置).

printf("%p\n","jesus");
printf("%p\n","jesus");
Run Code Online (Sandbox Code Playgroud)

另请注意:

printf("%p\n",&"jesus");
printf("%p\n","jesus");
Run Code Online (Sandbox Code Playgroud)

打印相同,但:

char* ptrToString = "jesus";
char* ptrToString = &"jesus"; //ERROR
Run Code Online (Sandbox Code Playgroud)

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

Ker*_* SB 6

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

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

 const char (*pj)[6] = &"jesus";
Run Code Online (Sandbox Code Playgroud)

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

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

printf("%p\n%p\n", (void const *)"jesus", (void const *)&"jesus");
Run Code Online (Sandbox Code Playgroud)