C memcpy来交换2D阵列的行



我正在尝试使用memcpyC库函数来交换2D数组(字符串数组(的行。此任务的源文件如下:

main.c

#include <stdlib.h>
#include "main.h"
char *table[NBLOCK] = {
"abcdefghi",
"defghiabc",
"ghiabcdef",
"bcaefdhig",
"efdhigbca",
"higbcaefd",
"cabfdeigh",
"fdeighcab",
"ighcabfde",
};
int main() {
swap_rows(table, 0, 2);
return 0;
}

main.h

#define NBLOCK 9
#define BLOCK_CELLS 9
void swap_rows(char**, int, int);

shuffle.c

#include <string.h>
#include "main.h"
void swap_rows(char **table, int r1, int r2) {
char tmp[BLOCK_CELLS];
size_t size = sizeof(char) * BLOCK_CELLS;
memcpy(tmp, table[r1], size);
memcpy(table[r1], table[r2], size); /* SIGSEGV here */
memcpy(table[r2], tmp, size);
}

swap_rows函数内部出现分段故障。在上面显示的三个memcpy调用中,第一个调用按预期工作。我评论了最后两个memcpy调用,并在下面添加了一行:

table[0][0] = 'z';

但是,分割错误再次出现。为什么不允许在swap_rows函数中覆盖table的值?

不允许修改字符串文字。有关更多信息,请参阅c-为什么我在向";char*s";用字符串文字初始化,但不是";char s[]";?。

您可以修改指针的值以交换行。

void swap_rows(char **table, int r1, int r2) {
char* tmp;
tmp = table[r1];
table[r1] = table[r2];
table[r2] = tmp;
}

如果您喜欢使用memcpy():

void swap_rows(char **table, int r1, int r2) {
char* tmp;
size_t size = sizeof(tmp);
memcpy(&tmp, &table[r1], size);
memcpy(&table[r1], &table[r2], size);
memcpy(&table[r2], &tmp, size);
}

在您的代码中,table不是定义为char的2D数组,它是指向char的指针数组,用指向字符串文字的指针初始化,不能修改。

由于字符串文字存储在受操作系统保护的只读内存中,因此会出现分段错误。

您应该交换swap_rows中的指针,或者将table定义为一个真正的2D数组,并使用适当的原型交换行:

#include <stdlib.h>
//#include "main.h"
#define NBLOCK 9
#define BLOCK_CELLS 9
void swap_rows(char table[][BLOCK_CELLS], int, int);
char table[NBLOCK][BLOCK_CELLS] = {
"abcdefghi",
"defghiabc",
"ghiabcdef",
"bcaefdhig",
"efdhigbca",
"higbcaefd",
"cabfdeigh",
"fdeighcab",
"ighcabfde",
};
int main() {
swap_rows(table, 0, 2);
return 0;
}
void swap_rows(char table[][BLOCK_CELLS], int r1, int r2) {
char tmp[BLOCK_CELLS];
size_t size = sizeof(tmp);
memcpy(tmp, table[r1], size);
memcpy(table[r1], table[r2], size);
memcpy(table[r2], tmp, size);
}

相关内容

  • 没有找到相关文章

最新更新