首页 > 解决方案 > 带有 memcpy 的列表中的分段错误

问题描述

我正在尝试使用 memcpy 将一个列表复制到另一个列表中,但是每次我尝试访问我复制的值时都会遇到分段错误。

我已经尝试过移动指针,但问题仍然存在。create_list 为列表创建一个新的头节点并返回它。这是一些代码:

/* The n variable shows the number of elements in the list for the head */
struct list {
    union{
        void *data;
        struct {
            unsigned num;
            List *end;
        };
    };
    List *node;
};
List *
create_list()
{
    List *head;

    head = malloc(sizeof(List));
    if (head == NULL)
        return NULL;
    head->num = 0;
    head->end = NULL;
    head->node = NULL;

    return head;
}
int
cpy_list(List *l1, List **l2)
{
    List *iter;
    void *data_aux;

    *l2 = create_list();
    iter = l1->node;
    while (iter != l1->end) {
        memcpy(&data_aux, iter->data, sizeof(iter->data));
        //printf("data_aux: %s\n", data_aux);
        insert_list(*l2, data_aux, NULL);
        //printf("iter->data: %s\n", iter->data);
        iter = iter->node;
    }

    return 1;
}

void
print_list(List *head)
{
    List *iter;
    iter = head->node;
    printf("[");
    while (iter != head->end) {
        printf("\"%s\",", iter->data);
        iter = iter->node;
    }
    printf("\"%s\"", iter->data);
    printf("]");
    printf("\n");
}

int
main(int argc, char *argv[])
{

    List *l1, *l2;
    char *str[] = {"Test0", "Test1", "Test2", "Test3", "Test4"};
    void *data_aux;
    l1 = create_list();

    for (int k = 0; k < 5; k++) {
        insert_list(l1 ,str[k], NULL);
    }
    printf("l1: ");
    print_list(l1);

    cpy_list(l1, &l2);
    print_list(l2);

    return 0;
}

标签: clistmemcpy

解决方案


memcpy(&data_aux, iter->data, sizeof(iter->data));

我假设这是一个错字问题(如果不是,请告诉我,并且您打算这样使用它)。&data_aux将返回变量的地址data_aux,而不是指向 data_aux的地址。此代码可能会导致堆栈溢出,因为您可能正在写入超出局部变量边界的数据data_aux(它具有指针的大小 - x86 上为 4 个字节,x64 上为 8 个字节)。如果iter->data大小很大,您将破坏堆栈并具有未定义的行为。

您可能想要的是分配一个由data_aux. 就像是:

data_aux = malloc(sizeof(iter->data));

然后传递data_aux而不是&data_aux在您的呼叫中传递给memcpy.


推荐阅读