首页 > 解决方案 > Memcpy 将 C 数组的内容作为指针返回

问题描述

我想将 ac 数组的内容复制到另一个数组的内容,我意识到你不能简单地做

array1 = array2;

相反,您应该使用 for 循环遍历每个索引,或者使用 memcpy. 我想使用 memcpy,因为人们说它可以节省空间,而且我的程序有 3KB 的限制(我想将它放入 QR 码中)。

我有一个函数,在我的程序中我试图利用它,但是当我打印结果时,它们会以指针的形式出现。我对为什么会发生这种情况感到非常困惑,因为我见过的其他人使用它结果很好。我能做什么呢?我的功能在这里:

void ShiftBlock(int curBlock[4][2], int shiftCoords[2], int curGrid[WIDTH][HEIGHT])
{
     int blockCoords[4][2] = {0};
     memcpy(blockCoords, curBlock, sizeof(blockCoords));

     for(int i = 0; i < 4; i++)
     {
          blockCoords[i][0] += shiftCoords[0];
          blockCoords[i][1] += shiftCoords[1];

          if (0 > blockCoords[i][0] || blockCoords[i][0] > WIDTH || 0 > blockCoords[i][1] || blockCoords[i][1] > HEIGHT || curGrid[blockCoords[i][0]][blockCoords[i][1]] != 0)
          {
               return;
          }
     }

     memcpy(curBlock, blockCoords, sizeof(curBlock));
}

标签: arrayscpointers

解决方案


数组不能作为参数传递,因此对于参数类型,数组类型的第一个维度总是被忽略,参数声明是一个指针。所以你的函数类型实际上是:

void ShiftBlock(int (*curBlock)[2], int* shiftCoords, int (*curGrid)[HEIGHT])

我建议使用这种形式,因为另一种具有误导性。

现在你可以看到这sizeof(curBlock)是错误的。它只是一个指针的大小。所以要么使用sizeof(blockCoords)orsizeof(int[4][2])要么4 * sizeof(*curBlock)


推荐阅读