LOGICALLY存储的char-pointing字符串在哪里?

Kor*_*ker 5 c string stack pointers char

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

char *s = "Hello";
Run Code Online (Sandbox Code Playgroud)

.

可以看出,变量没有动态定位在堆上,因为没有任何动态函数,如malloc,也没有定义为指向某个其他变量.

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

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


实际上,我是计算机工程系的毕业生,但我没有发现并且对于[char*string]逻辑上的工作方式有太多的好奇心.现在非常荣幸地提出这个问题.

Ian*_*ney 13

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

实际上,无论是基元(即),对象(即)还是指针(即),在这三个位置声明的任何非变量static和非thread_local变量的行为都相同.如果变量是静态的,则它始终存储在全局空间中.如果变量是,则每个线程都获得自己的副本,并且该副本通常存储在相应线程的堆栈的基础上.intvector<int>const char*thread_local

实际的字符串"Hello",其s指向被存储在一个恒定的全球空间的地方,通常是.data段.


fuz*_*fuz 2

没有什么特别的s,它是一个指针,它指向某个地方。具有自动存储时长就像任何其他未声明的局部变量一样,static。\xe2\x80\x9cspecial\xe2\x80\x9d 是您指向的字符串文字。

\n\n

您可以将字符串文字视为"foo"命名的全局变量。这些限制是:

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