复制一维元素二维数组

标签 c arrays pointers multidimensional-array memcpy

我有一个二维数组,需要将一个一维元素复制到一个数组中。 我试图在下面的示例中复制我的问题。但是下面的例子甚至没有编译,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/

相关文章:

javascript - .match 数组值未定义

c - 如何将一个节点从一个链表添加到另一个链表

c - 有没有一种简单的方法可以从文件中读取未经验证的十进制值?

C 语言中关于字符串的困惑

c - 正确使用 fread

arrays - 删除 Julia 中的连续重复项

Python C-API 访问字符串常量

c - 填充数组给出了意想不到的值

c - 将变量地址传递给 C 函数

c++ - 在应该按引用传递的地方按值传递指针