空字符串终止

时间:2013-07-18 12:58:06

标签: c c-strings null-terminated

一般来说编译器会自动添加 null 终止C字符串是对的吗?

所以在下面的例子中:

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

输出总是32?

感谢。

3 个答案:

答案 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字符的字符代码。字符09保证具有连续的代码(5.2.1p3),但没有任何特定的值。