gpt4 book ai didi

c - 为什么我的链表代码会导致段错误?

转载 作者:太空宇宙 更新时间:2023-11-04 04:06:48 26 4
gpt4 key购买 nike

我写了一个快速的通用链表,简单的东西。但是我有一个错误,我无法发现它在提示什么。相关代码:

typedef struct _node {
void *data;
struct _node *next;
} node;

typedef struct _queue {
node *root;
node *last;
unsigned int length;
} queue;

node * find_node(void *data, int size, queue *q)
{
node *n;

for(n=q->root;n;n=n->next)
if(memcmp(data, n->data, size)==0)
return (n);

return (NULL);
}

测试它:

queue q = {NULL, NULL, 0};
node *n;
int data[QUEUEMAX];
int i;

/* insert bunch of ints into queue */
for(i=0;i<QUEUEMAX;i++) {
data[i] = give_me_a_number();
n = alloc_node();
n->data = data[i];
insert_into(n, &q);
}

printf("list size = %d.\n", q.length);

/* print out, make sure they're there */
for(n=q.root;n;n=n->next)
printf("data = %d\n", (int)n->data); //*(int *)n->data didn't work, segfault?

/* find a specific node */
node *nd = find_node(&data[10], sizeof(int), &q);
/* remove it */
rm_node(nd, &q);

运行它:

$ ./test
list size = 256.
data = 10
data = 11
data = 12
data = 13
data = 14
data = 15
data = 16
... blah blah (256 lines)
Segmentation Fault

gdb 说问题是 find_node() 中的 memcmp()。我认为 gcc 提示 n->data 被传递给 memcmp()。有任何想法吗?另外,我在尝试执行 int x = *(int *)n->data 时遇到段错误,但这对我来说似乎有效,不是吗?

最佳答案

在这段代码中:

n->data = data[i];

您当前正在将 void* data 指针设置为 data[i] 但您确实想将其设置为 address of data[i] 所以你需要做的:

n->data = &data[i];

这也是为什么你的类型转换出现段错误的原因。

关于c - 为什么我的链表代码会导致段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5166900/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com