复制1d元素2d数组

时间:2016-01-07 19:35:25

标签: c arrays pointers multidimensional-array memcpy

我有一个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}这是为什么?

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] 本身现在是您感兴趣的指针,而不是指针的地址