c - 带有 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;
}
解决方案
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
.
推荐阅读
- c# - 我们应该使用实体框架生成的实体吗
- javascript - e.preventDefault() 和 e.stopPropagation() 没有按预期工作
- php - SilverStripe 4 - DataExtension 自动发布版本化文件错误
- android - 编辑显示不适合儿童 gif 的文本(GBoard)
- c - 将节点添加到链表时,它会覆盖之前的所有节点
- java - 迁移 AndroidX 运行错误 android.support.annotation 不存在
- .net - .NET:HttpClient 对象似乎忽略了服务器证书验证的证书颁发机构:我错过了什么吗?
- javascript - EJS循环遍历resultData中的嵌套数组
- azure - 在 ADFv2 中使用 Azure Functions 作为自定义活动
- excel - 访问 VBA 动态 Excel 导入