【发布时间】: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 并回答他们吗?我有兴趣了解关于字符串如何以及在哪个段中存储和访问的整个机制。此外,为什么某种方式适用于编译时字符串,但不适用于在运行时输入的输入。谢谢。