我有一个二维数组,需要将一个一维元素复制到单个数组中。
我试图在下面的例子中重复我的问题。但下面的示例甚至不编译,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]本身现在是您感兴趣的指针,而不是指针的地址。

10-05 23:35