我有一个二维数组,需要将一个一维元素复制到一个数组中。
我试图在下面的示例中复制我的问题。但是下面的例子甚至没有编译,gcc
提示
subscripted value is neither array nor pointer`
在 TwoDArray[9][99] = 99;
行,这是为什么呢?我不太明白,任何帮助将不胜感激!
int main(void)
{
int i = 0;
int* TwoDArray;
int DestArr[100] = {0};
TwoDArray = calloc(10,sizeof(int*));
for (i = 0; i < 10; i++)
TwoDArray[i] = calloc(100,sizeof(int));
TwoDArray[9][99] = 99;
memcpy(DestArr, &TwoDArray[9],sizeof(int)*100);
printf("DestArr[99] %d\n",DestArr[99]);
return 0;
}
编辑 1:
我错误地没有将 int** TwoDArray
声明为指向指针的指针 - 更改后,它现在可以完美编译,但我的结果中的值为 0
并且我我希望它是 99
- 为什么会这样?
最佳答案
在您的代码中,TwoDArray
是一个指针,指向 int
的指针。
所以,内存分配应该是这样的
TwoDArray = calloc(10,sizeof(*TwoDArray)); //i.e., sizeof(int)
代替
TwoDArray = calloc(10,sizeof(int*));
和 TwoDArray[i]
是 int
类型,不需要任何 malloc
-ation,无论如何。
因此,您可以使用 TwoDArray[i]
,前提是 i
在范围内。
TwoDArray[9][99]
无效,因为 TwoDArray[9]
无论如何都不是指针。
相关,要用到数组下标运算符,
postfix-expression [ expression ]
One of the expressions shall have type ‘‘pointer to complete object type’’, the other expression shall have integer type, and the result has type ‘‘type’’.
在 TwoDArray[9][99]
的情况下,TwoDArray[9]
当然不是指向完整对象类型的指针。
编辑:
如果你使用
int** TwoDArray;
和
TwoDArray[i] = calloc(100,sizeof(int));
那么,你需要改变
memcpy(DestArr, &TwoDArray[9],sizeof(int)*100);
到
memcpy(DestArr, TwoDArray[9],sizeof(int)*100);
^^
因为 TwoDArray[9]
本身 现在是您感兴趣的指针,而不是指针的地址。
关于复制一维元素二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34663666/