字符串文字strcpy的内存分配

时间:2017-11-08 18:41:50

标签: c string

int main()
 {
  char *s;
  strcpy(s,"here");
  return 0;
  }

在上面的代码中,我猜字符串文字的内存是在全局空间中分配的。它实际上是什么部分,何时?编译器是否通过并在程序空间中分配?此外,如果我使用相同的字符串文字(即char *k = "here";)初始化另一个字符串,它将指向相同的内存位置。 我试着想,因为我无法释放这个位置,如果我的代码中有很多字符串初始化,我会遇到任何麻烦。我想我唯一应该担心的是编译器输出太大,因为在这种情况下没有运行时内存分配?

1 个答案:

答案 0 :(得分:3)

确切的位置取决于目标文件格式(PEELFCOFF)和任何命令行选项(有些可能允许将字符串文字存储到可写内存段)。 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" );