指向char的指针和char数组的用法之间的差异
在下面的代码中,fizz可以正确打印,但是buzz不能。在这里使用字符数组有什么问题,或者我在什么方面使用了它指向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)))
#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故障事件