-2

是否可以说通常由编译器自动添加空终止 C 字符串?

所以在下面的例子中:

char * str = "0124";
printf("%x", str[str[3] - str[2] + str[4]]);

输出总是32?

谢谢。

4

3 回答 3

3

第一个问题:是

第二个问题:在 ASCII 系统上是的:你计算'4' - '2' + '\0'哪个是整数:0x34 - 0x32 + 0= 2 所以你得到str[2]哪个'2'是 0x32。 '4' - '2'为 2 在 C 中定义,但如果您在 EBCDIC 系统上运行代码,'2'则为 0xf2

于 2013-07-18T13:05:44.977 回答
1

是的,编译器确实添加了空终止符。因此有 5 字节的内存分配给 str 离开堆栈。

从外观上看,使用该字符串文字,(str[3] - str[2] + str[4]) 的计算结果为 (52 - 50 + 0),因此您正在访问 str[2],它将打印 0x32十六进制。

于 2013-07-18T13:07:32.817 回答
1

终止空字符由编译器添加;6.4.5p6:

6 - 在翻译阶段 7 中,将一个字节或零值代码附加到由一个或多个字符串文字产生的每个多字节字符序列。然后使用多字节字符序列来初始化一个静态存储持续时间和长度刚好足以包含该序列的数组。[...]

printf输出将是系统上字符的字符代码20保证字符9具有连续代码(5.2.1p3),但不具有任何特定值。

于 2013-07-18T13:08:58.823 回答