c语言 - 将指针分配给空指针时的 Seg 错误



我可能错过了一些关于指针和内存管理的真正重要的东西。 我正在构建一个双向链表。我有一个struct Node

struct Node {
void* data;
nodep prev;
nodep next;
};

nodep是指向此类节点的指针的 typedef

typedef struct Node * nodep;

现在我写了一个insertAt()函数,它接受一个nodep lst,它基本上是指向列表中第一个元素的指针,或者NULL为空列表,一个int pos,插入元素的位置和一个 void* data,这是 Node 的有效负载。这是我的代码摘录,我收到一个错误:

nodep insertAt(nodep lst, int pos, void *data){
nodep new = malloc(sizeof(struct Node));
[...]

new -> data = data;
assert(new != NULL);
printf("memory allocated!n");
/* insert at last position */
if(pos == -1) {
[...]
/* insert at first position */
} else if (pos == 0) {
if(lst == NULL) {
new -> next = lst;
lst = new;
} else {
[...]
}
/* insert at pos */
} else {        
[...]
}
return new;
}

这是我在main()函数中调用insertAt()的方式:

int i;
nodep lst = NULL;
insertAt(lst, 0, "test");

当我使用 valgrind 运行我的程序时,我得到一个

不在地址0x10的映射区域内访问

对于此行代码:

lst = new;

我想做的是将nodep lst指向nodep new,然后是列表的第一个元素。我真的不明白,为什么我会遇到这个错误。

提前感谢任何帮助。

干杯尼克

如果要修改lst则必须使用双指针。

为了简单起见,我将使用int

int i;
int* ptr = &i;
func(ptr);
func(int* p){
p = ....; //this won't change ptr!
}
func(&ptr);
func(int** p){
*p = ....; //this will change ptr!
}

如果是双指针和sizeof(int) = 4sizeof(int*) = 4

---------------       ---------------        ---------------
|0x4|0x5|0x6|0x7|     |0x0|0x1|0x2|0x3|      |   |   |   |   |
---------------       ---------------        ---------------
0x8 0x9 0xA 0xB      0x4 0x5 0x6 0x7         0x0 0x1 0x2 0x3
address of p         address of ptr           address of i

*p会给你i.这是ptr指向的地址。这就是为什么使用双指针可以更改"外部"指针的原因。

相关内容

  • 没有找到相关文章

最新更新