【问题标题】:Segmentation Fault when using memcpy with void pointers - C使用带有 void 指针的 memcpy 时出现分段错误 - C
【发布时间】:2016-12-18 13:40:34
【问题描述】:

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

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

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 作为项目类型。

当我调用它时,我得到一个 Segmentation fault: 11 错误,我不知道为什么。

任何帮助将不胜感激!

编辑:

我已经包含了一些其他的代码,因为这可能是东西返回的地方,尽管 seg 错误出现在 insertBefore 中的 memcpy

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);
...

【问题讨论】:

  • 为什么不让列表的用户担心分配和释放他们的数据呢?将它们归类为使用malloc 来存储数据是非常有限的。插入列表时只需要一个有效的数据指针,以及创建列表对象时释放数据的回调。
  • 我正在尝试创建一个库模块,以便以后可以在用户看不到节点或任何东西的情况下重用它,而只能根据需要在数据之间前后移动,使其尽可能简单对他们来说可能。
  • (我也没有为此创造这个想法,我刚刚被告知我需要实现它,我完全同意你的看法!)
  • C 中也没有没有需要转换malloc& 朋友的结果,也不推荐任何方式。
  • 您将3 作为地址传递!这怎么可能解决?将insertBefore(l,(void *)3) 更改为int i=3; insertBefore(l, &i)insertBefore(l, &((int){3}))

标签: c pointers segmentation-fault malloc memcpy


【解决方案1】:

您的代码尝试memcpy(new->item, 3, sizeof(int)) 您遇到分段错误,因为 3 不是可取消引用的地址。

相反,您应该这样做:

int x = 3;
insertBefore(l, &x);

【讨论】:

    猜你喜欢
    • 2014-12-15
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 2013-11-18
    • 2018-09-11
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    相关资源
    最近更新 更多