【问题标题】:Difference between usage of pointer to char and char arraychar和char数组的指针用法的区别
【发布时间】:2014-12-18 02:42:54
【问题描述】:

在下面的代码中,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");
    }
}

【问题讨论】:

  • 这一行:char buzz[4] = "buzz";会溢出buzz[]缓冲区,因为字符串包含一个空终止字节,所以“buzz”实际上是5个字节长。写入缓冲区末尾是未定义的行为,可能导致段错误事件

标签: c arrays pointers gcc char


【解决方案1】:

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

char buzz[5] = "buzz";

但是,还请注意,在使用字符串字面量进行初始化时,不需要显式声明变量的长度。您可以省略号码,它会正常工作。

char buzz[] = "buzz";

【讨论】:

    【解决方案2】:

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

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

    char buzz[] = "buzz";
    

    这将包括一个空终止符并分配正确的空间量。

    【讨论】:

      【解决方案3】:

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

      char buzz[5] = "buzz";
      

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-12-23
          • 1970-01-01
          • 2012-03-02
          • 1970-01-01
          • 2021-01-26
          • 2019-09-13
          • 2018-04-05
          • 1970-01-01
          相关资源
          最近更新 更多