为什么我们不能将字符串值赋给2d char数组?

时间:2016-09-09 09:37:42

标签: c arrays string multidimensional-array

#include<stdio.h>
int main()
{
char a[3][5];
int i;

a[0][5]="hai";
a[1][5]="cool";
a[2][5]="many";

for(i=0;i<3;i++)
printf("%s \n",a[i]);
return 0;
}

为什么我们不能像这样分配字符串值,但可以使用字符串函数分配它?

4 个答案:

答案 0 :(得分:3)

你有三个问题。首先,您尝试将指针指定给单个char。第二个问题是您尝试分配的单个字符超出范围。

第三个问题是你不能分配给一个数组,只能复制到它。

您可以使用strcpy函数将字符串复制到数组中来解决所有这三个问题:

strcpy(a[0], "hai");

注意不要复制长度适合目标数组的字符串,因为这样会写出超出边界并导致未定义的行为。源不能超过四个字符(五个带终结符)。可以使用strncpy来解决,但该函数有另一个问题,可能会使目标字符串无法终止。

澄清:在作业a[0][5] = "hai"中,表达式a[0][5]是单个字符,但它也是undefined behavior,因为索引5超出范围。

然后字符串文字实际上是一个包含四个字符的数组(字符'h''a''i'和字符串终结符'\0')。在类似于赋值的表达式中使用字符串文字时,衰减到指向其第一个元素的指针。因此,"hai"可被视为指针。

因此,在a[0][5] = "hai"中,您将指针分配给字符串中的字母'h',以及单个和越界字符a[0][5]

答案 1 :(得分:1)

只读访问的另一个选项(如果你不修改字符串文字)是一个指针数组:

char *a[3]; /* Or better yet: const char *a[3]; */

a[0]="hai";
a[1]="cool";
a[2]="many";

答案 2 :(得分:0)

首先,您应该检查赋值运算符的操作数的数据类型。

在LHS上,您有char,并且您正在尝试为其分配char *(RHS)。这是类型不匹配,因此不可能。

那就是说,a是一个二维数组,你甚至不能分配给a[0],作为数组(不是数组元素 )不可转让。

您必须将字符串文字复制到内存中,但是,您必须执行类似

的操作
 strcpy(a[0], "hai");

所以,回答,

  

....但是可以使用字符串函数分配它吗?

嗯,使用赋值运算符赋值和使用字符串族库函数进行复制之间存在差异。它们的行为方式不同。使用赋值运算符赋值给数组是不可能的,因为它需要一个可修改的左值作为左操作数,而数组(name)不是可修改的左值。

答案 3 :(得分:0)

"hai"类型const char[4]。虽然在某些情况下它会衰减const char*

您正在尝试将const char[4]类型分配给char类型。这是类型不匹配,编译器将不允许这样做。

但是,您可以编写strncpy(a[0], "hai", 5);,其中5是可以从字符串文字中复制的字符数的上限。