【问题标题】:what is the reason of different allocation of memory to the given strings? [duplicate]给给定字符串分配不同内存的原因是什么? [复制]
【发布时间】:2014-02-22 21:36:11
【问题描述】:

第一个声明如下

char*str="hello";

在这种情况下,字符串文字存储在只读存储器中。

第二个声明如下

char str[10]="name";

在这种情况下,字符串文字存储在可写内存中。

为什么两个字符串字面量分配的内存不同?

【问题讨论】:

  • @GrijeshChauhan :非常感谢您在评论中给出的问题中的回答?
  • @GrijeshChauhan :在您的回答中,您说在程序启动时将字符串复制到数组中。那么这就意味着字符串占用双倍内存。
  • @kevingomes 不,只是为了解释一下,声明char str2[] = "hello"; 只是意味着将创建一个带有字符串"hello" 的数组。

标签: c string pointers memory char


【解决方案1】:

对于char*str="hello";(实际上应该是const char*str="hello";),实际的字符串文字作为数组存储在只读内存中,str 只是指向它。在第二个示例中,数组存储在全局数据段(用于全局变量)或堆栈(用于本地数据)中,没有指针。

这样想:

对于

const char *str = "hello";

你有

+-----+ +-----------+ |字符串 | ---> | "你好\0" | +-----+ +-----------+

虽然

char str[] = "hello";

你有

+-----------+ | "你好\0" | +-----------+

【讨论】:

  • +1 为您的艺术解释 :)
  • 可能值得在 str[] 的最后添加几个空格来表示它最多可以容纳 10 个字符。
  • @Slater 根据 OP 的声明,但不在此答案中:)
  • Joachim 我相信明天我会见到你@100K 提前恭喜!
  • @Grijesh Woops,你说得非常对,我可能真的应该阅读他的声明。
【解决方案2】:

文字本身没有区别。不同之处在于您告诉编译器您想要的实际变量str。该变量具有不同的类型,因此不同的类型具有不同的表示形式。

在第一种情况下,您说“我希望 str 是一个字符指针,初始化到可以找到字符串 "hello" 的某个位置(我不在乎在哪里)”。

在第二种情况下,您说“我希望 str 是一个 10 个字符的数组,其中前五个用字符串 "name" 初始化。

这些显然是完全不同的东西。很有可能在第二种情况的程序中,字符串文字"name" 仍然存在于某个只读位置,但在程序启动时被复制到str。

【讨论】:

  • 如何在没有任何命令的情况下将name 复制到str。
  • @kevingomes 命令以不同的语法形式给出,编译器对两种语法的解释不同。怎么样?这是答案。
  • @kevingomes 有一个初始化程序。数组可以通过赋值表达式来初始化,这是 C 语言的一个特性。你不能拥有int x[2]; x = { 1, 2 };,但你可以拥有int x[2] = { 1, 2};。同样的事情,但字符串有more sugar。
  • @unwind :在你的回答中你说It's highly likely that in the program for the second case the string literal "name" still exists in some read-only location but is copied into str when the program starts. ...所以这是否意味着字符串文字在复制到其他位置时占用双倍内存。
  • 我相信 char str[10]="name"; 会初始化所有 10 个 char 而不仅仅是前 5 个,而且找不到引用 - 你的想法?
【解决方案3】:

编译可执行文件时,字符串文字必须来自程序中的某个位置。因此,它们与文本一起存储在一个特殊的数据段中。由于您不想每次执行该段时都修改程序文本,因此该段被映射到您的进程虚拟机只读。

如果您只需要读取该常量字面量,那么指针引用就足够了。

但是,一旦您需要对其进行修改,那么您需要像在第二个声明中那样进行复制,这将在范围开始时将该字符串文字复制到堆栈中。

【讨论】:

    猜你喜欢
    • 2011-06-19
    • 2021-10-01
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多