堆还是栈?在c++中函数调用中引用常量字符串时

Heap or Stack? When a constant string is referred in function call in C++

本文关键字:函数调用 引用 字符串 常量 c++      更新时间:2023-10-16

考虑函数:

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节的一部分。它被加载到内存中,包含字符串等内容。