0

在下面的代码中,

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* 类型?

4

3 回答 3

4

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

C 不允许您使用赋值运算符复制数组。使用strcpy,strncpymemcpy代替。

(我怀疑错误的具体措辞是因为数组在某些地方衰减为指针,我希望赋值的左侧不是这些地方之一,而在赋值的右侧使用是。)

于 2012-07-08T05:39:13.720 回答
2

char Array[n][m]: 在几乎所有语言中,它的意思是:array of array。所以,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];

因为,它只是复制指针的值:意味着复制此指针指向的位置。但是,当然,它会极大地改变您的代码。我只是在这里画得更清楚。

希望这有帮助:)

于 2012-07-08T06:05:48.317 回答
1

您试图将字符数组 strArray[0] 的基地址更改为 strArray[1] 的基地址,这是不允许的。因此你得到了错误。

于 2012-07-09T07:54:55.190 回答