【问题标题】:Why is the first code different than second?为什么第一个代码与第二个代码不同?
【发布时间】:2020-05-13 17:33:50
【问题描述】:

我处于最低水平,并且真的很想学习 C,但我就是不知道它是如何工作的。

char name[20] = "Dummy Text";
name[0]='M';
printf("%s", name);

这完美地工作并将文本中的 D 更改为 M。

char name[20];
name[20]="Dummy Text";
name[0]='M';
printf("%s", name);

这只会打印 M。 为什么如果我设置变量的值晚于声明它时,它的工作方式会有所不同?根据我所看到的,使用数字它可以正常工作。

【问题讨论】:

  • name[20]char 你不能给它分配字符串
  • name[20] 也超出了数组的末尾。数组声明后,可以使用复制操作更新数组(例如strcpy(name, "Dummy Text")),但不能使用赋值语句将字符串文字复制到数组中。

标签: c variables


【解决方案1】:
char name[20] = "Dummy Text";

即字符数组的初始化。字符串“Dummy Text”存储在该数组中,如下所示:

name[0] = 'D'
name[1] = 'u'
name[2] = 'm'
name[3] = 'm'
name[4] = 'y'
name[5] = ' '
name[6] = 'T'
name[7] = 'e'
name[8] = 'x'
name[9] = 't'
name[10] = '\0'

第二个声明:

char name[20];
name[20]="Dummy Text";

您声明一个字符数组,可以包含 20 个字符类型的元素。但是这一行name[20]="Dummy Text",您尝试将字符串Dummy Text 分配给字符值。这是未定义的行为。

name[20] 也是未定义的行为,因为可用于此数组的最大索引为 19(从 019)。

如果要复制字符串,可以使用strcpy函数,例如

strcpy(name, "Dummy Text");

现在,两个程序将打印相同的字符串:Mummy Text

【讨论】:

  • 知道了。只是认为我可以稍后在代码中初始化,对我来说没有意义,为什么不这样做。如果我说 int x,数字是一样的; x=5;或 int x=5;
【解决方案2】:
char name[20];
name[20]="Dummy Text";

这并没有达到您的预期,原因有两个:

  1. name 的索引从 0 到 19 - 元素 name[20] 超出了数组的末尾。

  2. 您不能使用 = 运算符分配字符串(或其他数组表达式)。您应该从编译器中获得“您不能将char * 分配给char”的诊断信息。

除非它是sizeof_Alignof 或一元& 运算符的操作数,或者是用于在声明中初始化字符数组的字符串文字,表达式T”类型的“N 元素数组”将被转换(“衰减”)为“指向 T 的指针”类型的表达式,表达式的值将是数组第一个元素的地址。

初始化

char name[20] = "Dummy Text";

将字符串文字"Dummy Text" 的内容复制到name 数组。但是,only 在声明中有效。如果你写了

char name[20];
name = "Dummy Text";

那么您不是将字符串文字的内容复制到数组中-您正在尝试将指向字符串文字的第一个字符的指针分配给数组。同样,您应该从抱怨此问题的编译器那里获得诊断信息。

如果要将字符串文字(或存储在char 数组中的字符串)的内容复制到另一个数组,则需要使用strcpy 库函数:

strcpy( name, "Dummy Text" );

【讨论】:

    【解决方案3】:

    为什么第一个代码和第二个代码不同?

    char name[20] = "Dummy Text";

    是一个字符数组初始化

    同时

    name[20]="Dummy Text";

    是一个数组元素赋值,就像通过指定

    将“M”分配给第一个元素一样

    name[0]='M';

    【讨论】:

    • @FiddlingBits,它可能不会导致警告或运行时错误。这可能只是一个未定义的行为。但是,我只是想回答 OP 关于两个程序有何不同的问题,而没有详细说明第二个程序有什么问题。
    • 不确定您的意思是:“而name[20]="Dummy Text"; 是一个数组元素分配,就像您分配M 的方式一样”。 name[20]="Dummy Text";至少应该导致警告。
    • 不仅会引发警告,而且还是越界赋值(写入20个元素数组的第21个元素)。
    • @RobertoCaboni,它可能不会导致任何这些。
    猜你喜欢
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 2016-12-01
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    相关资源
    最近更新 更多