指向char的指针和char数组的用法之间的差异

指向char的指针和char数组的用法之间的差异,c,arrays,pointers,gcc,char,C,Arrays,Pointers,Gcc,Char,在下面的代码中,fizz可以正确打印,但是buzz不能。在这里使用字符数组有什么问题,或者我在什么方面使用了它 #include <stdio.h> int main() { int i; char *fizz = "fizz"; char buzz[4] = "buzz"; for(i = 1; i <= 100; i++) { if(!((i %3 == 0) || (i%5 == 0)))

在下面的代码中,fizz可以正确打印,但是buzz不能。在这里使用字符数组有什么问题,或者我在什么方面使用了它

#include <stdio.h>

int main() {

    int i;

    char *fizz = "fizz";
    char buzz[4] = "buzz";

    for(i = 1; i <= 100; i++) {
            if(!((i %3 == 0) || (i%5 == 0)))
                    printf("%d", i);
            if(i%3 == 0)
                    printf("%s", fizz);
            if(i%5 == 0)
                    printf("%s", buzz);

            printf("\n");
    }
}
#包括
int main(){
int i;
char*fizz=“fizz”;
字符嗡嗡声[4]=“嗡嗡声”;

对于(i=1;i两个字符串实际上都没有四个字节长。C字符串以NUL结尾,因此它们的长度总是以字符为单位加上一个字符作为
'\0'
字符。因此,您应该更改
buzz
的声明,如下所示:

char buzz[5] = "buzz";
但是,还需要注意的是,在初始化时不需要显式声明变量的长度,只需省略数字即可

char buzz[] = "buzz";

%s
说明符打印字符串。字符串是一系列字符,后跟空终止符。换言之,您可以告诉
printf
字符的起始位置,并且
printf
一直打印,直到遇到空终止符为止

“buzz”
表达式是一个以null结尾的字符串,但是您将其插入了
字符buzz[4]
因此空终止符不合适。结果是
buzz
数组不包含空终止符,因此
printf
读取字符串结尾,导致未定义的行为。要修复此写入:

char buzz[] = "buzz";

它将包括一个空终止符并分配适当的空间量。

buzz包含4个字符,它没有为空字符保留的空间,因此无法使用%s正确打印。%s指定要打印以空终止的字符串,如果字符串不是以空终止的,它将无法正常工作


将初始化更改为
char buzz[]=“buzz”

您已声明buzz数组的大小为4,包括
\0
字符串的大小为5。因此您必须将buzz数组的大小更改为5,或者不提及大小

char buzz[5] = "buzz";
由于buzz不是指针变量,如果buzz是指针变量,它将根据字符串分配内存,因此无需指定大小。 由于buzz是一个数组,因此您必须正确提及大小。 在打印时,我们使用
%s
%s
将打印字符串,直到出现\0字符。 buzz字符串中没有\0字符,这就是问题所在。

这一行:char buzz[4]=“buzz”;将使buzz[]缓冲区溢出,因为字符串包含nul终止字节,因此“buzz”实际上有5个字节长。超过缓冲区结尾写入是未定义的行为,可能导致seg故障事件