【问题标题】:C - Same char[] variables, different output [duplicate]C - 相同的char []变量,不同的输出[重复]
【发布时间】:2022-08-13 01:09:56
【问题描述】:

为什么 printf 会为 4 个不同的 char[] 变量显示不同的输出,如果它们都具有相同的值?

这是我的代码:

#include <stdio.h>
#define     MAX 1000

main()
{
    char w[MAX];
    char x[MAX];
    char y[MAX];
    char z[MAX];

    printf(\"w: %s\\n\", w);
    printf(\"x: %s\\n\", x);
    printf(\"y: %s\\n\", y);
    printf(\"z: %s\\n\", z);
}

这是输出:

gcc test.c -o test && ./test
test.c:4:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
    4 | main()
      | ^~~~
w: 
x: ��<��
y: 
z: S�td
  • 这与您发布的警告无关,但没有初始化任何变量,因此说它们具有相同的值是不正确的。实际上这段代码有未定义的行为。特别是使用%s 打印时,变量应包含以零结尾的字符串。
  • w, x, y, z 不是字符串,因为您尝试在 printf%s 中处理它们。 char 和 int 具有相同的字节值(我认为他们称之为他们)。
  • 顺便说一句,您的具体警告是因为您没有提到 main() 的返回类型应该是 int
  • if they all have the same value?你怎么知道价值他们有?
  • 您需要了解并修复该警告消息。

标签: arrays c initialization printf c-strings


【解决方案1】:

为什么 printf 为 4 个不同的 char[] 变量显示不同的输出 如果它们都具有相同的值?

数组没有“相同的值”。您有未初始化的具有自动存储持续时间的字符数组,其中可以包含任何不确定的值

char w[MAX];
char x[MAX];
char y[MAX];
char z[MAX];

所以在 printf 的调用中使用它们

printf("w: %s\n", w);
printf("x: %s\n", x);
printf("y: %s\n", y);
printf("z: %s\n", z);

调用未定义的行为。

如果您在函数 main 之前声明数组,那么它们将被零初始化为具有静态存储持续时间。在这种情况下,它们将包含空字符串,您将获得如下输出

w:
x:
y:
z:

请注意,根据 C 标准,不带参数的函数 main 应声明为

int main( void )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多