为什么第一段代码和第二段不一样?

问题描述 投票:0回答:1

我的水平最低,真的很想学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,为什么我设置变量值的时间比声明变量的时间晚,效果就不一样?就我所看到的情况来看,对于数字,它的工作效果还不错。

c variables
1个回答
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


1
投票
char name[20];
name[20]="Dummy Text";

这并不像你所期望的那样,有两个原因:

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

  2. 你不能使用这个函数来分配字符串(或其他数组表达式)。= 运营商。 你 从编译器中得到一个类似于 "你不能分配一个 "的诊断。char *char".

的操作数时除外。sizeof, _Alignof或单利 & 操作符,或者是一个字符串文字,用于在声明中初始化一个字符数组,是一个 表情 类型为 "N-元素数组的 T"将被转换("衰减")为类型为 "指向T的指针 "的表达式,该表达式的值将是数组中第一个元素的地址。

该 "指针到T "类型的表达式将被转换("衰减")为 "指针到T "类型的表达式,表达式的值将是数组中第一个元素的地址。初始化

char name[20] = "Dummy Text";

复制字符串文字的内容 "Dummy Text"name 阵列。 然而,该 只是 在声明中工作。 如果你写了

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

那么你不是在复制字符串文字的内容到数组中--你是在尝试将字符串文字的第一个字符的指针赋值到数组中。 同样,你应该从编译器那里得到一个诊断,抱怨这个问题。

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

strcpy( name, "Dummy Text" );

0
投票

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

char name[20] = "Dummy Text";

是一个字符数组初始化

name[20]="Dummy Text";

是一个数组元素的赋值,就像你把'M'赋值给第一个元素一样,通过指定

name[0]='M';

© www.soinside.com 2019 - 2024. All rights reserved.