将多字符数组复制到另一个多字符数组
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)))
这样的宏函数。
我正在将 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)))
这样的宏函数。