使用带有void指针的memcpy时的分段错误 - C.

时间:2016-12-18 13:40:34

标签: c pointers segmentation-fault malloc memcpy

所以我在C中创建了一个双向链接的通用列表。我已经成功创建了它作为存储数据的整数,但现在我需要使它成为通用的。

我创建了一个列表和节点变量类型:

struct node{

  struct node *prev;
  struct node *next;
  void *item;

};

struct list{

  struct node *first;
  struct node *current;
  struct node *last;
  int itemSize;

};

我在将值插入节点中的项目时遇到问题。我有以下代码在当前指针之前插入一个newNode。

void insertBefore(list *l, void *p){

  struct node *new = (struct node*) malloc(sizeof(struct node));
  new->item = malloc(l->itemSize);

  memcpy(new->item,p,l->itemSize);

...

Void指针p是一些数据,itemSize是所述数据的字节数。当然这不是整个insertBefore代码,但其中的逻辑应该是合理的,因为我已经使列表使用int作为项的类型。

当我打电话给我时,我得到一个分段错误:11错误,我不知道为什么。

非常感谢任何帮助!

编辑:

我已经包含了一些其他代码,这些代码被称为可能是东西回归的地方,尽管seg错误位于memcpy中的insertBefore

list *newList(int b){

  list *l = (list*)malloc(sizeof(list));
  l->itemSize = b;
  l->first = NULL;
  l->current = NULL;
  l->last = NULL;

  return l;
}

然后在main中调用它:

list *l = newList(sizeof(int));
insertBefore(l, (void *)3);
...

1 个答案:

答案 0 :(得分:1)

您的代码尝试memcpy(new->item, 3, sizeof(int)) 您正在获得分段错误,因为3不是可解除引用的地址。

相反,你应该这样做:

int x = 3;
insertBefore(l, &x);
相关问题