使用指向char和char数组的指针之间的区别

时间:2014-12-18 02:42:54

标签: c arrays pointers gcc char

在下面的代码中,fizz打印正确,但是buzz没有。在这里使用char数组或使用错误的方式有什么问题?

#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");
    }
}

4 个答案:

答案 0 :(得分:6)

两个字符串实际上都不是四个字节。 C字符串是 NUL终止的,所以它们总是以字符长度加上'\0'字符的长度。因此,您应该更改buzz的声明,如下所示:

char buzz[5] = "buzz";

但是,还要注意,不需要在使用字符串文字初始化时明确声明变量的长度。你可以省略号码,它会正常工作。

char buzz[] = "buzz";

答案 1 :(得分:3)

%s说明符打印字符串。字符串是一系列字符后跟一个空终止符。换句话说,你告诉printf你的角色在哪里开始,printf一直打印,直到遇到空终结符。

"buzz"表达式是一个以空字符结尾的字符串,但是你把它变成了char buzz[4],所以null终止符不合适。结果是buzz数组不包含空终止符,因此printf读取字符串的结尾,从而导致未定义的行为。要解决这个问题:

char buzz[] = "buzz";

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

答案 2 :(得分:3)

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

char buzz[5] = "buzz";

因为buzz不是指针变量,如果buzz是指针变量,它将根据字符串分配内存,因此不需要指定大小。 由于buzz是一个数组,你必须正确地提到它的大小。 在打印时我们使用%s%s将打印字符串,直到出现\ 0字符。 在buzz字符串中没有\ 0字符,这就是问题。

答案 3 :(得分:2)

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

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