使用 memcpy 的列表中的分段错误
Segmentation fault in a list with memcpy
我正在尝试使用 memcpy 将一个列表复制到另一个列表中,但每次我尝试访问我复制的值时都会遇到分段错误。
我已经尝试过移动指针,但问题仍然存在。
create_list 为列表创建一个新的头节点并 returns 它。这是一些代码:
/* 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;
}
memcpy(&data_aux, iter->data, sizeof(iter->data));
我假设这是一个拼写错误(如果不是并且您打算那样使用它,请告诉我)。 &data_aux
将 return 变量 data_aux
的地址,而不是 data_aux
指向的地址 。此代码可能会导致堆栈溢出,因为您可能
将数据写入超出局部变量 data_aux
的边界(具有指针的大小 - 在 x86 上为 4 个字节或在 x64 上为 8 个字节)。如果 iter->data
的大小很大,您将破坏堆栈并产生未定义的行为。
您可能想要分配一个缓冲区以供 data_aux
指向。类似于:
data_aux = malloc(sizeof(iter->data));
然后在调用 memcpy
时传递 data_aux
而不是 &data_aux
。
我正在尝试使用 memcpy 将一个列表复制到另一个列表中,但每次我尝试访问我复制的值时都会遇到分段错误。
我已经尝试过移动指针,但问题仍然存在。 create_list 为列表创建一个新的头节点并 returns 它。这是一些代码:
/* 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;
}
memcpy(&data_aux, iter->data, sizeof(iter->data));
我假设这是一个拼写错误(如果不是并且您打算那样使用它,请告诉我)。 &data_aux
将 return 变量 data_aux
的地址,而不是 data_aux
指向的地址 。此代码可能会导致堆栈溢出,因为您可能
将数据写入超出局部变量 data_aux
的边界(具有指针的大小 - 在 x86 上为 4 个字节或在 x64 上为 8 个字节)。如果 iter->data
的大小很大,您将破坏堆栈并产生未定义的行为。
您可能想要分配一个缓冲区以供 data_aux
指向。类似于:
data_aux = malloc(sizeof(iter->data));
然后在调用 memcpy
时传递 data_aux
而不是 &data_aux
。