【问题标题】:Where is a char-pointing string stored LOGICALLY?指向字符的字符串逻辑存储在哪里?
【发布时间】:2015-10-25 04:17:21
【问题描述】:

在 C 语言中,我们可以使用 char * 来指向一个字符串。就像

char *s = "Hello";

.

可以看出,变量既不是动态位于堆上的,因为没有任何像 malloc 这样的动态函数,也没有定义为指向某个其他变量。

所以我的问题是,变量 [char *s] 指向的文字字符串在哪里进行逻辑存储?

它是否像任何普通的局部变量一样存储在堆栈中?或者,类似堆栈的东西?


其实我是计算机工程系的毕业生,但是我一直没有发现,也一直很好奇[char * string]是如何逻辑工作的。很荣幸现在就问这个问题。

【问题讨论】:

  • 存储在文本段中
  • @RaghuSrikanthReddy 不一定。许多平台将字符串文字放在rodata 部分。
  • @MaggiePhillips 你真的需要澄清你的问题主体。 s 的存储位置和它指向 的存储位置可能完全不同,您可能会得到关于这两者的少量答案,其中大部分是关于s 的推测性答案,因为您没有显示它存在的上下文。 (全局、本地、静态本地??)。
  • @WhozCraig 你说得对,我当然需要将变量 s 和字符串位置相除。我真正好奇的是文字字符串“Hello”的位置。谢谢。

标签: c string pointers char stack


【解决方案1】:

变量char* s 存储在堆栈中,假设它是在函数体中声明的。如果它是在一个类中声明的,那么它就会存储在该类的对象所在的任何位置。如果它被声明为全局,那么它被存储在全局内存中。

事实上,你在这三个位置声明的任何非static 和非thread_local 变量的行为方式都是一样的,无论它是基元(即int)还是对象(即@987654325 @) 或指针(即const char*)。 如果一个变量是静态的,它总是存储在全局空间中。如果变量是thread_local,每个线程都有自己的副本,该副本通常会存储在相应线程的堆栈底部。

s 指向的实际字符串"Hello" 存储在某个恒定的全局空间中,通常是.data 段。

【讨论】:

  • s 的存储位置取决于它的定义位置。如果它是本地的(在函数或块内),它通常存储在堆栈中,但如果它是全局变量则不会。此外,它没有必须存储在堆栈上,C规范实际上并没有指定局部变量应该存储在哪里,它只指定了变量的范围和生命周期。
  • 嗯,我现在有点记住我在大学学习“操作系统”的基础知识了。我想我曾经草草写过“文本”部分,然后我似乎又检查了那本书。谢谢。
  • 这个答案是非常具体的实现。有些实现没有文本段、堆栈等。
  • 请注意,许多平台都有一个特殊的rodata 段用于只读全局变量。它与text的不同之处在于rodata的内容不能在支持将某些内存区域标记为不可执行的机器上执行。
【解决方案2】:

字符串文字具有静态存储持续时间。这意味着它们在您的程序的整个生命周期中都存在。它们可能存储在不可写区域中,并且可能与其他字符串文字重叠。同一文字的两个不同实例可能重合,也可能不重合。

这取决于您的实现(编译器/链接器/等)。做出符合这些要求的决定。

【讨论】:

    【解决方案3】:

    s 没有什么特别之处,它是一个指针,它指向某个地方。它具有自动存储持续时间,就像任何其他未声明 static 的局部变量一样。但是,“特殊”的是您指向的字符串文字。

    您可以将像"foo" 这样的字符串文字视为具有一些特殊约束的未命名全局变量。这些约束是:

    • 您不能写入字符串文字,就好像它被声明为const
    • 两个字符串文字可能共享相同的地址或重叠

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多