首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >未赋值的字符串如何存储在内存中,以及如何引用它?

未赋值的字符串如何存储在内存中,以及如何引用它?
EN

Stack Overflow用户
提问于 2012-05-13 01:55:56
回答 2查看 207关注 0票数 2

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

代码语言:javascript
运行
复制
printf("%p\n","jesus");
printf("%p\n","jesus");

另请注意:

代码语言:javascript
运行
复制
printf("%p\n",&"jesus");
printf("%p\n","jesus");

打印相同的内容,但是:

代码语言:javascript
运行
复制
char* ptrToString = "jesus";
char* ptrToString = &"jesus"; //ERROR

所以我想知道一个未赋值的字符串是如何存储在内存中的,以及如何指向它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-13 02:01:19

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

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

代码语言:javascript
运行
复制
 const char (*pj)[6] = &"jesus";

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

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

代码语言:javascript
运行
复制
printf("%p\n%p\n", (void const *)"jesus", (void const *)&"jesus");
票数 6
EN

Stack Overflow用户

发布于 2012-05-13 02:12:53

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10566131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档