考虑函数:
char *func()
{
return "Some thing";
}
是常数string
(char
数组)"Some thing"
存储在堆栈作为局部函数调用或作为堆中的全局?
我猜它在堆里。
如果函数被多次调用,内存中有多少个"Some thing"
副本?(是堆还是堆栈?)
字符串文字" something "的类型为const char*
。因此,它们既不在堆上也不在堆栈上,而是在一个只读位置,这是一个实现细节。
数据数据区包含程序使用的全局变量和静态变量初始化。这部分可以进一步分为初始化只读区和初始化读写区。为在C和C中实例char s[] = "hello world"定义的字符串像int debug=1这样的语句将被存储在"main"之外初始化读写区。像const char* string这样的C语句= "hello world"使字符串字面值"hello world"被存储初始化只读区域和字符指针变量字符串在初始化的读写区。例如:static int i = 10将被存储int I = 10将存储在数据段
常量字符串通常与程序代码放在一起,既不是堆也不是堆栈(这是一个实现细节)。只有一个副本存在,每次函数返回时它都会返回相同的指针值(这是标准保证的)。由于字符串在程序内存中,它可能永远不会被加载到内存中,如果你运行程序的两个副本,那么它们将在RAM中共享相同的副本(这只适用于只读字符串,其中包括C中的字符串常量)。
都不是,它在程序的静态部分。类似于将字符串作为全局变量。在翻译单元中只有一个字符串的副本。
既不在堆上,也不在堆栈上,它是可执行映像(COFF)中所谓的init节的一部分。它被加载到内存中,包含字符串等内容。