在C中,我们可以使用char *指向一个字符串。就像
char *s = "Hello";
可以看出,变量不是动态定位在堆上的,因为没有像malloc这样的动态函数,也没有定义为指向某个其他变量。
所以我的问题是,变量[char * s]指向逻辑存储的文字字符串在哪里?
它是否像任何普通的局部变量一样存储在堆栈中?或者,像堆栈这样的东西?
实际上,我是计算机工程系的毕业生,但我找不到并且对[char * string]的逻辑运作方式过于好奇。现在非常荣幸地提出这个问题。
答案 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