我有一个2d数组,需要将一个1d元素复制到一个数组中。
我试图在下面的例子中复制我的问题。但是下面的例子甚至没有编译,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;
}
EDIT1:
我错误地没有声明int** TwoDArray
作为指针的指针 - 在更改之后,它现在可以完美地编译,但我的结果中的值是0
,我希望它是{{1}这是为什么?
答案 0 :(得分:1)
在您的代码中,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 ]
其中一个表达式的类型''指向完整的对象类型'',另一个 expression应具有整数类型,结果类型为''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]
本身现在是您感兴趣的指针,而不是指针的地址。