我有一个从用户空间程序动态修改(添加和删除)的节点链接列表。节点分配总是在用户空间中的可能性有多大?
通常的链表节点,
struct node {
int x;
struct node *next;
};
我得到了这个问题,因为当我遍历列表时,内核会向SIGSEGV
这个用户空间进程发送一个信号。而且每当我创建一个新节点时,我都会检查 NULL 指针。
我也知道SIGSEGV
如果进程尝试访问内核内存,内核会发送信号。
我有一个从用户空间程序动态修改(添加和删除)的节点链接列表。节点分配总是在用户空间中的可能性有多大?
通常的链表节点,
struct node {
int x;
struct node *next;
};
我得到了这个问题,因为当我遍历列表时,内核会向SIGSEGV
这个用户空间进程发送一个信号。而且每当我创建一个新节点时,我都会检查 NULL 指针。
我也知道SIGSEGV
如果进程尝试访问内核内存,内核会发送信号。
SIGSEGV 是分段错误。这意味着您的程序正在尝试访问不在程序分配的内存范围或段内的区域中的内存。分割是一个丑陋的系统,人们过去必须直接处理,但现在不再那么多了。今天对您来说意味着您的代码很可能会延迟空指针或某些未初始化的值。
您应该做的是将调试器连接到您的程序并查看导致 SIGSEGV 被抛出的地址。一看到它,它很可能是 0x0,或者一些垃圾值,例如 0xDEADC0DE 之类的。
可能您没有将节点中的所有指针都设置为 0x0。在构造函数中执行此操作并仔细检查您的 addNode() removeNode() 函数,以确保您没有悬空指针。
不要忘记设置 next=NULL; 在节点构造函数中,或者在节点创建之后。是的,分配总是在用户空间完成
节点分配总是在用户空间中的可能性有多大?
100%确定。
当我遍历列表时,内核发送一个 SIGSEGV 信号
这意味着您的程序中存在试图访问 la-la-land 的错误。
我也知道如果进程尝试访问内核内存,内核会发送 SIGSEGV 信号。
SIGSEGV 是当程序试图访问被禁止的内存时发送的 POSIX 标准信号。因此,不一定只是内核内存,而是您的进程可以访问的空间之外的任何内存。