Not Null Terminated字符数组

时间:2014-04-26 22:17:18

标签: c++ c assembly

#include <stdio.h>

char s[3] = "Robert";
int main()
{
    printf("%s",s);
}

Output: Rob

如何正确打印?该字符串不是以null结尾。 我看到了集会。它使用.ascii存储“Rob”,它不是空终止的。 我期待一些垃圾和Rob一起打印。 有人能解释一下这种行为吗?

1 个答案:

答案 0 :(得分:4)

您的“Rob”已存储在可执行文件的额外部分中。可执行文件中的部分是对齐的,即带有数据的部分用0填充,直到下一部分。所以printf从部分填充中得到“它”0。举例说明:

#include <stdio.h>

char dummy[] = "ocop";
char s[3] = "Robert";
char second[] = "in Hood";
int main( void )
{
    printf("%s",s);
    return 0;
}

输出(MinGW-GCC无优化):Robin Hood
输出(MinGW-GCC优化):Robocop

现在填充中没有0但是下一个字符串的开头也将被输出。