【发布时间】:2015-12-28 19:04:18
【问题描述】:
我不断收到Segmentation Fault (core dumped) 运行时错误,我不知道为什么。
我的代码:
struct Node
{
void *next;
void *val;
};
typedef struct Node* NodePtr;
struct List
{
NodePtr head;
};
typedef struct List* ListPtr;
ListPtr create()
{
ListPtr ptr = malloc(sizeof(struct List));
return ptr;
}
int insert(ListPtr list, void *obj)
{
NodePtr newObj = malloc(sizeof(struct Node));
//Cast next as a self referencing Node
newObj->next = (NodePtr) newObj->next;
//Point to beginning of list
NodePtr current = list->head;
if(list->head == NULL)
{
newObj->val = obj;
list->head->next = newObj;
newObj->next = NULL;
return 1;
}
return 0;
}
int main(int argc, char *argv[])
{
int x = 2;
int *p = &x;
ListPtr thing = create();
insert(thing, p);
return 0;
}
错误在这里:list->head->next = newObj 经过一些调试。我以为我必须为 list->head->next 分配内存,但是当我为此添加代码时,它仍然给了我同样的错误。我是投错了还是没有正确分配内存?任何帮助将不胜感激,谢谢!
【问题讨论】:
-
list->head->next = newObj;if(list->head == NULL) ==>NULL->next = newObj;。list->head也没有初始化。 -
专业提示:在 C 的第一年,不要使用 typedef。它只会让你感到困惑。
-
谢谢,我忘了初始化磁头。添加了它,但仍然没有运气。我还必须使用 typedef,赋值中有 typedef。我发布的代码不是其中的一部分,但它是相似的。
-
在结构节点定义中:
void *next;是不好的做法,它会抑制类型检查,从而抑制强类型。 (例如,您可以这样做struct Node *p= malloc(sizeof *p) ; p->next = "Hello, world\n";,编译器不会发出任何警告或错误。 -
你永远不会初始化列表头。在您尝试访问它之前,您需要这样做。
标签: c memory segmentation-fault void-pointers coredump