堆还是堆?当在C++中的函数调用中引用常量字符串时

Alf*_*ong 5 c++ heap stack function global-variables

考虑功能:

char *func()
{
    return "Some thing";
}
Run Code Online (Sandbox Code Playgroud)

堆栈中存储的常量string(char数组)"Some thing"是函数调用的本地函数还是堆中的全局函数?

它在堆里.

如果多次调用该函数,那么"Some thing"内存中有多少个副本?(它是堆还是堆栈?)

Mah*_*esh 9

字符串文字"有些东西"是类型的const char*.因此,它们既不在堆上也不在堆栈上,而是在只读位置,这是一个实现细节.

来自维基百科

数据

数据区包含初始化的程序使用的全局变量和静态变量.该段可以进一步分类为初始化的只读区域和初始化的读写区域.例如,在C中由char s [] ="hello world"定义的字符串和在"main"之外的类似int debug = 1的C语句将存储在初始化的读写区域中.并且像const char*string ="hello world"这样的C语句使字符串文字"hello world"存储在初始化的只读区域中,字符指针变量字符串存储在初始化的读写区域中.例如:static int i = 10将存储在数据段中,global int i = 10将存储在数据段中

  • +1,这更正确,因为字符串文字所在的位置确实是一个实现细节. (2认同)
  • 值得补充的是,在系统上有这样的只读内存,写入这样的字符串会导致崩溃.如果字符串本身在堆,堆栈或读/写数据段上,您可能会侥幸逃脱它.这说明了为什么理解静态段中的哪些数据很重要. (2认同)
  • 它是不正确的>>`字符串文字"有些东西"属于const char*.`字符串文字的类型是`const char [11]`. (2认同)
  • @Mahesh:C++ 03,§2.13.4/ 1说:*不以L开头的字符串文字是普通的字符串文字,也称为窄字符串文字.普通的字符串文字具有类型**"n const char数组"**和静态存储持续时间(3.7),其中n是下面定义的字符串的大小,并使用给定的字符进行初始化.* (2认同)