【问题标题】:Memory allocation by a string declaration通过字符串声明分配内存
【发布时间】:2014-05-22 01:10:46
【问题描述】:

当我这样声明一个字符串时:

char string[] = "Hello";

实际上等价于-

char string[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

因此,堆栈上的内存是通过声明为字符串分配的。但是当我声明这样的字符串时会发生什么:

char *string = "Hello";

变量“string”包含字符串的第一个字母“H”在内存中的位置。我想问一下:

  1. 字符串在内存中的位置?堆栈\堆\等。

  2. 是否自动为字符串分配了足够的内存,或者我必须分配 自己记忆(例如,malloc)到字符串?如果必须,我该怎么做(我想要一个代码的小例子)?

我想指出,我的问题的答案很有可能取决于系统。如果是,请注意这个事实,并尝试根据流行平台(Windows、Linux 等)上发生的情况来回答。

【问题讨论】:

  • @tesseract 我认为是。谢谢:)
  • 这里重要的一点是,当您执行char string[] = "hello" 时,您可以执行string[0] = 'm' 以使其成为mello,但如果您执行char *string = "hello",您就不能执行string[0] ='m',如果字符串由编译器放置在只读内存中。

标签: c arrays string pointers memory-management


【解决方案1】:

char *string = "Hello"; 中的字符串的存储位置没有定义。在实践中,它通常位于称为文本段的只读存储器中,其中存储了程序的代码。指针存储在“堆栈”或数据段中,具体取决于定义是在函数内部还是在任何函数外部。

您无需为字符串分配内存。

答案与系统无关(除了系统可能将字符串存储在任何方便的位置,而不同的系统可能将其存储在不同的位置)。

【讨论】:

  • 另外,请注意,用于常量字符串的内存经常(尽管不总是!)设置为只读。尝试写入这样的字符串通常会导致段错误。为了反映这一点,指向此类字符串的指针正确键入为const char *;将此转换为 char * 应该会产生警告!
  • @duskwuff 谢谢,好习惯。
  • 我确实提到它通常(经常)在只读内存中。我没有提到指针也应该定义为const(应该如此),也没有提到尝试修改它指向的字符串通常会使你的程序崩溃。
猜你喜欢
  • 1970-01-01
  • 2021-01-26
  • 2018-08-12
  • 2011-03-22
  • 1970-01-01
  • 2021-07-27
  • 1970-01-01
  • 1970-01-01
  • 2014-08-27
相关资源
最近更新 更多