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

Copying multi char array to another multi char array

我正在将 Java 代码转换为 C 代码,并在 Java:

中交换多个数组的内容这样简单的事情
boolean[][] temp = board;
board = nextBoard;
nextBoard = temp;

C好像麻烦很多

在查看此站点上的类似问题后,我了解到我必须使用我在名为 arrayCopy 的方法中启动的 memcpy

这是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: warning: incompatible pointer types passing 'char (*)[60][60]' to parameter of type 'char *'

然而memcpy只有returns个指针,所以我不能切换参数。我也不能使用 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 函数或使用像 #define MINSIZE(a,b) (sizeof((a)) < sizeof((b)) ? sizeof((a)) : sizeof((b))) 这样的宏函数。