我有一个二维数组,需要将一个一维元素复制到单个数组中。
我试图在下面的例子中重复我的问题。但下面的示例甚至不编译,gcc
抱怨道
下标值既不是数组也不是指针`
在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
操作。因此,只要
TwoDArray[i]
在范围内,就可以使用i
。TwoDArray[9][99]
无效,因为无论如何TwoDArray[9]
不是指针。相关,若要使用数组下标运算符,
postfix-expression [ expression ]
其中一个表达式的类型应为“指向完整对象类型的指针”,另一个表达式的类型为
表达式应具有整数类型,结果的类型应为“类型”。
在
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]
本身现在是您感兴趣的指针,而不是指针的地址。