微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C memcpy交换2D数组的行

如何解决C memcpy交换2D数组的行

我正在尝试使用memcpy C库函数来交换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,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';

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

解决方法

不允许您修改字符串文字。 有关更多信息,请参见c - Why do I get a segmentation fault when writing to a "char *s" initialized with a string literal,but not "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 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,2);
    return 0;
}

void swap_rows(char table[][BLOCK_CELLS],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);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。