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

C++ 堆还是堆?在C+;中的函数调用中引用常量字符串时+;,c++,function,stack,global-variables,heap,C++,Function,Stack,Global Variables,Heap,考虑以下功能: char *func() { return "Some thing"; } 常量string(chararray)“Some thing”存储在堆栈中是函数调用的本地还是堆中的全局 我猜它在堆里 如果函数被多次调用,内存中有多少份“Some thing”?(是堆还是堆栈?常量字符串通常与程序代码一起放置,程序代码既不是堆也不是堆栈(这是一个实现细节)。只有一个副本将存在,每次函数返回时,它将返回相同的指针值(这由标准保证)。由于字符串位于程序内存中,因此它可能永远不会加

考虑以下功能:

char *func()
{
    return "Some thing";
}
常量
string
char
array)
“Some thing”
存储在堆栈中是函数调用的本地还是堆中的全局

我猜它在堆里


如果函数被多次调用,内存中有多少份“Some thing”?(是堆还是堆栈?

常量字符串通常与程序代码一起放置,程序代码既不是堆也不是堆栈(这是一个实现细节)。只有一个副本将存在,每次函数返回时,它将返回相同的指针值(这由标准保证)。由于字符串位于程序内存中,因此它可能永远不会加载到内存中,并且如果您运行两个程序副本,则它们将在RAM中共享同一副本(这仅适用于只读字符串,其中包括C中的字符串常量)。

这两种情况都不在程序的静态部分。类似于将字符串作为全局变量。翻译单元中只有一个字符串副本。

无论是在堆上还是在堆栈上,它都是所谓的可执行映像(COFF)的一部分。它被加载到内存中并包含字符串之类的内容。

字符串文字“Some thing”的类型为
const char*
。因此,它们既不在堆上也不在堆栈上,而是在只读位置上,这是一个实现细节

资料

数据区包含程序使用的全局和静态变量 已初始化的。这一部分可进一步分为 初始化只读区和初始化读写区。对于 实例C和C中由char s[]=“hello world”定义的字符串 像“main”之外的int debug=1这样的语句将存储在 初始化读写区。还有一个C语句,比如constchar*string =“hello world”使字符串文本“hello world”存储在 初始化只读区域和字符指针变量字符串 在初始化的读写区域中。例如:将存储静态int i=10 在数据段中,全局int i=10将存储在数据段中


我试图添加另一个答案,只是为了增加混乱。请注意,函数返回了错误的类型。它应该是
char const*
,在ELF系统上,此类字符串文字通常位于
.rodata
(只读数据)部分。令人困惑的句子:“由于字符串位于程序内存中,因此可能永远不会加载到内存中”。你什么意思?我也很困惑。但我猜第一个内存意味着.text或.data(静态/只读部分),第二个内存意味着heap和stack+1,这更正确,因为字符串文本所在的位置确实是一个实现细节。值得补充的是,在系统上有这样的只读内存,写入这样的字符串将导致崩溃。如果字符串本身在堆、堆栈或读/写数据段上,您很可能不会受到影响。这说明了为什么理解哪些数据在静态段中很重要。这是不正确的>>
字符串文字“某些东西”的类型为const char*
字符串文字的类型为
const char[11]
@Mahesh:No Mahesh。如果它们的类型为
contchar*
,则此程序将出现编译错误:。。。因为
const char*
无法转换为
const char[N]
@Mahesh:C++03,§2.13.4/1说:不以L开头的字符串文字是普通字符串文字,也称为窄字符串文字。普通字符串文字具有类型“array of n const char”和静态存储持续时间(3.7),其中n是以下定义的字符串大小,并用给定字符初始化。常见,但不保证。有可能是
“X”!=“X”