#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;
}
为什么我们不能像这样分配字符串值,但可以使用字符串函数分配它?
答案 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是可以从字符串文字中复制的字符数的上限。