int main()
{
char *s;
strcpy(s,"here");
return 0;
}
在上面的代码中,我猜字符串文字的内存是在全局空间中分配的。它实际上是什么部分,何时?编译器是否通过并在程序空间中分配?此外,如果我使用相同的字符串文字(即char *k = "here";
)初始化另一个字符串,它将指向相同的内存位置。
我试着想,因为我无法释放这个位置,如果我的代码中有很多字符串初始化,我会遇到任何麻烦。我想我唯一应该担心的是编译器输出太大,因为在这种情况下没有运行时内存分配?
答案 0 :(得分:3)
确切的位置取决于目标文件格式(PE与ELF与COFF)和任何命令行选项(有些可能允许将字符串文字存储到可写内存段)。 ELF会将其存储在.rodata
段中,顾名思义,该段只读。
同一个字符串文字的多个实例可以映射到同一个位置,但不需要AFAIK(我不知道任何创建多个实例的编译器)相同的文字,但我的经验并不广泛)。
确定的事情:
请注意,您的代码存在错误 - 您从未向s
分配有意义的地址,因此strcpy
实际上是在尝试将字符串"here"
写入随机位置,是未定义的行为。您可能打算写
s = "here";
将s
设置为指向文字。如果没有,那么s
将必须是一个足以容纳字符串的数组:
char s[sizeof "here"]; // sizeof evaluated at compile time
或者您必须动态分配该空间:
char *s = malloc( strlen( "here" ) + 1 );
if ( s )
strcpy( s, "here" );