【发布时间】: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