我认为a完全等于b。但跑步的结果证明我错了。哪一部分我理解错了?
代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{

    char a[] = "abcdefg";
    char b[] = {'a' , 'b' , 'c' , 'd' , 'e' , 'f' , 'g'};
    printf("%s\n" , a);
    printf("%s\n" , b);
    system("pause");
    return 0;
}

最佳答案

当C编译器发现以下代码时

char a[] = "abcdefgh";

它实际上留出了足够的内存来存储9个字符,即字符串中包含的8个字符,再加上一个额外的字符来存储一个0,即nul字符。C使用nul字符标记字符串的结尾。如果没有它,任何C字符串函数都无法判断字符串的结尾在内存中的位置。
守则
char b[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};

告诉C显式地为8个字符保留存储空间,并将它们设置为您给定的值。没有指定nul终止符(即末尾没有0),因此C函数将无法判断此字符串的长度。
printf("%s\n" , a);

告诉C打印从内存中的地址a开始找到的字符串。它一直打印字符,直到找到编译器悄悄为您放置的0终止符。
printf("%s\n" , b);

告诉C打印从内存中的地址b开始找到的字符串。它会一直打印字符,直到找到一个0终止符,但是由于您没有在数组中放置一个终止符,它会在您定义的数组之后继续打印内存中的任何内容,直到遇到一个0为止。
要解决这个问题,需要显式地告诉编译器在其他字符后面加上0。可以使用特殊字符\0执行此操作,如下所示:
char b[] = {'a' , 'b' , 'c' , 'd' , 'e' , 'f' , 'g', '\0' };

09-13 04:30