将多字符数组复制到另一个多字符数组

时间:2015-06-26 22:29:38

标签: c arrays struct memcpy

我正在将Java代码转换为C,这就像在Java中交换多数组内容一样简单:

boolean[][] temp = board;
board = nextBoard;
nextBoard = temp;

在C中似乎更麻烦。

在本网站上查看类似问题之后,我了解到我必须使用memcpy,这是我在名为arrayCopy的方法中启动的。

这是arrayCopy

 void arrayCopy(char * a, char * b)
 {
     struct universe data;
     int r;
     for(r = 0; r < data.rows; r++)
     memcpy(b, a, sizeof(a));
 }

我从主要方法中打电话:

char temp[SIZE][SIZE];
arrayCopy(&data.board, &temp);
arrayCopy(&data.nextBoard, &data.board);
arrayCopy(&temp, &data.nextBoard);

使用以下结构:

struct universe
{
  char board[SIZE][SIZE];
  char nextBoard[SIZE][SIZE];
  int columns;
  int rows;
}universe;

但是我收到的警告如下:

  

A2Q1.c:189:15:警告:不兼容的指针类型传递         'char(*)[60] [60]'到'char *'

类型的参数

然而memcpy只返回指针,所以我无法切换参数。我也不能使用malloc(),因为我还没有学到它,所以任何其他建议都会受到赞赏。

2 个答案:

答案 0 :(得分:0)

试试这个

void swapBoard(struct universe *x){
    char temp[SIZE][SIZE];
    memcpy(temp, x->board, sizeof(temp));
    memcpy(x->board, x->nextBoard, sizeof(temp));
    memcpy(x->nextBoard, temp, sizeof(temp));
}
int main(){
    struct universe data;
    //...
    swapBoard(&data);

答案 1 :(得分:0)

我认为你让它有点过于复杂。您可以直接在上面的示例中使用memcpy来复制a到b中的所有内容,而无需迭代它。如果你运行这段代码......

int main()
{
    char temp[60][60];
    printf("%d", sizeof(temp));
}

您将看到sizeof将为您提供3600个字节,60 * 60到阵列分配的总字节数。这些字节分配在一块连续的内存中,memcpy可以一次性复制它们。这证明了这一点:

int main()
{
    char temp[60][60];
    memset(temp, 'a', sizeof(temp));
    char temp2[60][60];
    memset(temp2, 'b', sizeof(temp2));
    memcpy(temp2, temp, sizeof(temp2));
    printf("%c", temp2[23][34]);
}

printf将打印&#39; a&#39;。在上面的代码中,这应该可以正常工作:

char temp[SIZE][SIZE];
memcpy(data.board, temp, sizeof(data.board));
memcpy(data.nextBoard, data.board, sizeof(data.nextBoard));
memcpy(temp, data.nextBoard, sizeof(temp));

请注意,这假设所有这些数组的大小相同。您可能想要创建一个minsize函数或使用像#define MINSIZE(a,b) (sizeof((a)) < sizeof((b)) ? sizeof((a)) : sizeof((b)))这样的宏函数来保证安全。