C中的二维char数组

时间:2012-07-08 05:34:45

标签: c

在下面的代码中,

char strArr[5][20];
int i;

for(i=0; i<5; i++)  
{  
   printf("string %d: ", i+1);  
   gets(strArr[i]);  
}

strArr[0]=strArr[1]; //have an compile error on this line. Why cannot assign?

如上面代码块的最后一行所述,为什么会出现编译错误(不兼容的类型)?左右操作数都是char * type?

3 个答案:

答案 0 :(得分:4)

左右操作数都是char[20]类型,而不是char*。变量实际上有为它们保留的存储空间,它们不仅仅是指向字符串的指针。因此,如果合法,则将从一个数组复制20个字符到另一个数组。

C不允许您使用赋值运算符复制数组。请改用strcpystrncpymemcpy

(我怀疑错误的具体措辞是因为数组在某些地方衰变成指针,我希望在使用时,分配的左侧是其中一个地方在作业的右侧是。)

答案 1 :(得分:2)

char Array[n][m]:几乎所有语言都意味着:数组数组。所以,Array[0] Array[1] ....是一个数组。实际上,它是指向每个元素的连续记忆的指针。

此数组的类型为:char[m]。并且,当您编写:arrayX = arrayY时,您希望将arrayY中的所有值复制到arrayX,但C不允许这样做。你必须手工复制:

for(int i=0; i<=sizeof(arrayX)/sizeof(char); i++)
      arrayX[i] = arrayY[i];

我经常使用memcpy,但背景基于上面的代码。

 memcpy (strArray[1],strArray[0],sizeof(strArr[0]));

但是,如果你这样声明,则没有编译错误:

char * strArray[5][10];

因为,它只是复制指针的值:指向此指针所指向的复制。但是,当然,它会非常改变您的代码。我只是为了更清楚而在这里画画。

希望这有帮助:)

答案 2 :(得分:1)

您正在尝试使用strArray [1]更改char数组strArray [0]的基址,这是不允许的。 因此,您收到了错误。