一个字符串指向的字符串在哪里存储LOGICALLY?

时间:2015-08-03 06:37:49

标签: c string pointers char stack

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

char *s = "Hello";

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

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

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

实际上,我是计算机工程系的毕业生,但我找不到并且对[char * string]的逻辑运作方式过于好奇。现在非常荣幸地提出这个问题。

3 个答案:

答案 0 :(得分:13)

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

事实上,您在这三个位置声明的任何非static和非thread_local变量的行为方式相同,无论它是否是原语(即int),一个对象(即vector<int>)或一个指针(即const char*)。 如果变量是静态的,则它始终存储在全局空间中。如果变量是thread_local,则每个线程都会获得自己的副本,并且该副本通常会存储在相应线程的堆栈底部。

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

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

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

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