【问题标题】:How is space allocated char* arrays?char* 数组是如何分配空间的?
【发布时间】:2015-04-08 18:30:54
【问题描述】:

例如,在

#define NUM_THREADS 8
char *messages[NUM_THREADS];
messages[0] = "English: Hello World!";
messages[1] = "French: Bonjour, le monde!";
messages[2] = "Spanish: Hola al mundo";
messages[3] = "Klingon: Nuq neH!";
messages[4] = "German: Guten Tag, Welt!"; 
messages[5] = "Russian: Zdravstvytye, mir!";
messages[6] = "Japan: Sekai e konnichiwa!";
messages[7] = "Latin: Orbis, te saluto!";

在编译期间,编译器是否计算所有这些字符串的最大长度,然后保留空间 = NUM​​_THREADS * ( max_len + 1 )。为字符串末尾的空字节添加 1。还是根据四舍五入到最接近的单词的长度为每个字符串分配不同的空间量?

但是,这并不总是可行的,因为初始化不一定要在编译时进行。我假设指向将存储字符串的数据部分的指针与messages[i]一起保存。

【问题讨论】:

  • 它是一个指针数组(每个指针指向一个它自己长度的字符数组)并使其成为const char *messages[NUM_THREADS];
  • 这对于 ISO 标准来说是非法的,尽管 gcc 和 clang 允许它没有错误。
  • 什么是非法的?您也可以在 Blindy 的回答中浏览我的 cmets 并回答他们吗?我有兴趣了解关于字符串如何以及在哪个段中存储和访问的整个机制。此外,为什么某种方式适用于编译时字符串,但不适用于在运行时输入的输入。谢谢。

标签: c++ c string


【解决方案1】:

这些字符串使用的内存正好等于字符串长度加一(终止空字符)。您定义的数组具有 4*NUM_THREADS 字节(假设您的 vanilla 版本的 32 位 C 编译器),因为它只包含指针,而不是整个字符串的副本。

没有四舍五入,没有猜测,没有数据模糊。这是C。

【讨论】:

  • "这是 C。"太棒了。
  • 我是否正确假设字符串驻留在数据段中并且对于 cin>>messages[i] 也适用,即即使在运行时字符串也进入数据段?
  • cin>>messages[i] 是未定义的行为。
  • 哦,感谢您向我指出这一点。我在 Xcode 上写的,它没有给出任何编译错误。但它在运行时出现故障。你能解释一下为什么会这样吗?为什么即使对于运行时输入,相同的机制也不起作用。这实际上是我的主要问题。
  • @drescherjm 从您最近发布的链接(stackoverflow.com/questions/1614723/…)中,我了解到我所指的数据段是只读的,无法在运行时写入。那么为什么数据段存在呢?只是为了保存在运行时声明的字符串文字并节省堆栈空间和执行期间的一些时间(堆栈写入/加载)?
猜你喜欢
  • 2018-03-26
  • 2018-03-20
  • 2014-07-17
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-18
相关资源
最近更新 更多