一般来说编译器会自动添加 null 终止C字符串是对的吗?
所以在下面的例子中:
char * str = "0124";
printf("%x", str[str[3] - str[2] + str[4]]);
输出总是32?
感谢。
答案 0 :(得分:3)
第一个问题:是的
第二个问题:在ASCII系统上是:您计算'4' - '2' + '\0'
整数:0x34 - 0x32 + 0
= 2,因此得到str[2]
'2'
为0x32。
{是}的'4' - '2'
在C中定义,但如果您在EBCDIC系统上运行代码,则'2'
为0xf2
答案 1 :(得分:1)
是的,编译器会添加null终止符。因此,有5个字节的内存分配给str栈。
通过它的外观,使用该字符串文字,(str [3] - str [2] + str [4])的计算结果为(52 - 50 + 0),因此你正在进行str [2],将以十六进制打印0x32。
答案 2 :(得分:1)
编译器添加终止空字符; 6.4.5p6:
6 - 在转换阶段7中,将值为零的字节或代码附加到每个多字节 由字符串文字或文字产生的字符序列。多字节字符 然后,序列用于初始化静态存储持续时间和长度的数组 足以包含序列。 [...]
printf
输出将是系统中2
字符的字符代码。字符0
到9
保证具有连续的代码(5.2.1p3),但没有任何特定的值。