c中的字符串初始化

String Initialization in c

我是 C 编程的新手,请随时纠正我,我坚持。我对 C 中的字符串的基本理解是,当我们初始化一个字符串时,一个空字符会自动分配到字符串的末尾,并且该空字符无法读取或写入,但仅在内部使用。

所以当我创建一个大小为 4 的字符串作为 char str[3] 并为其分配一个词 "RED" 并使用 puts 函数或 printf("%s",str) 打印它时,我得到了一个不寻常的输出打印为 RED(SMIILEY FACE)

然后我再次将字符串的大小减小到 char str[2] 并将 RED 分配给它,然后编译它,然后再次收到一个输出 RE(Smiley face)

如果有人能向我解释一下,我将不胜感激。在下面发布 C 代码

    int main()
{

 char s1[3]="RED";
 char s2[]="RED";
 puts(s1);
 puts(s2);
 printf("%s",s1);
 return 0;
}

空字符占用一个exra字符(字节)。所以除了要初始化的单词的字符数之外,还需要使用额外的space

 char s1[4]="RED"; //3 for RED and 1 for the null character

另一方面

char s2[3]="RED";

空字符没有space。 "RED" 在那里,但打印时会遇到 I/O 问题,因为末尾没有存储空字符。您的数据存储良好,但 printf 无法正确识别,因为没有空字符。

 char s2[]="RED";

这会起作用,因为自动分配了 4(字节)的内存,其中包括 space 作为终止空字符。

char s1[3] = "RED";

是一个valid statement。它将 3 个字符从常量字符串文字 "RED"(长度为 4 个字符)复制到字符数组 s1 中。 s1 中没有终止符 '[=14=]',因为没有空间容纳它。

注意 copy,因为 s1 是可变的,而 "RED" 不是。这使得声明不同于例如const char *s1 = "RED";,其中字符串 复制。

puts(s1)printf("%s", s1) 的结果都未定义。 s1 中没有终止符 '[=14=]'。将其视为带有 1 的字符串会导致任意行为。

char s2[] = "RED";

这里,sizeof(s2) == 4,因为"RED"有四个字符,所以在计算space的时候需要把尾部的'[=14=]'算进去。