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

C 将多字符数组复制到另一个多字符数组,c,arrays,struct,memcpy,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 d

我正在将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));
 }
使用以下结构:

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(),因为我还没有学会它,所以任何其他建议都将不胜感激。

试试这个

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);

我觉得你把事情弄得有点复杂了。您可以在上面的示例中直接使用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将打印“a”。在上面的代码中,这应该可以正常工作:

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函数或使用一个宏函数,如
#定义minsize(a,b)(sizeof((a))

data.rows应该包含什么?你根本不会初始化这个结构——这个循环可能会使你的程序出错。sizeof(a)也是错误的,它将返回指针的大小,而不是大小。我在程序的另一部分初始化它,它从输入文件中读取行数。该函数在程序的另一部分中是否相同?因为如果是,那仍然是错误的。
board[SIZE][SIZE]
是一个指针,当作为参数传递时,不需要获取它的地址*(即:
(&data.board,&temp)
应该是
(data.board,temp)
)此外,在传递静态声明的数组时,始终需要传递每行中的元素数(即
数组复制(char*a,char*b)
需要是
数组复制(char a[][SIZE],char b[][SIZE])
)。您可以在错误消息的
'char(*)[60][60]
部分中看到编译器在抱怨什么。此外,
sizeof(a)
arrayCopy
函数中没有意义(嗯,这不是毫无意义的——它只是报告字符指针
a
的大小,在64位框上总是
8
,在x86框上总是
4
。为什么?指针衰减。
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));