gpt4 book ai didi

当我使用 A* 获取 void * 值并打印它时命令终止

转载 作者:行者123 更新时间:2023-11-30 17:04:28 24 4
gpt4 key购买 nike

源代码粘贴在 paste.ubuntu.com

为什么data = head->data;不起作用?我的功能是

typedef struct Element 
{
struct Element *next;
void *data;
}
Element;

int pop(Element ** stack, void *data)
{
if(!*stack) return 0;
Element *head = *stack;
data = head->data;
*stack = head->next;
free(head);
head = NULL;
//delete head;
return 1;
}

gdb日志是这样的:

 - (gdb) b pop
- Breakpoint 1 at 0x400675: file test.c, line 25.
- (gdb) r
- Starting program: /test
- Breakpoint 1, pop (stack=0x7fffffffda78, data=0x0) at test.c:25
- 25 if(!*stack) return 0;
- (gdb) l
- 20 *stack = head;
- 21 return 1;
- 22 }
- 23 int pop(Element ** stack, void *data)
- 24 {
- 25 if(!*stack) return 0;
- 26 Element *head = *stack;
- 27 data = head->data;
- 28 *stack = head->next;
- 29 free(head);
- (gdb) n
- 26 Element *head = *stack;
- (gdb)
- 27 data = head->data;
- (gdb)
- 28 *stack = head->next;
- (gdb) p head->data
- $1 = (void *) 0x602010
- (gdb) p data
- $2 = (void *) 0x0

我像这样使用pop func

 A *a = NULL;
pop(&stack,a);

结构:

typedef struct A {
int val;
} A;

最佳答案

你几乎猜对了。

你需要

pop(&stack, ((void**)&a));

而不是

pop(&stack,a);

你的 pop 函数应该是这样的:

int pop(Element ** stack, void **data) // modified
{
if(!*stack) return 0;
Element *head = *stack;
*data = head->data; // modified
*stack = head->next;
free(head);
head = NULL;
//delete head;
return 1;
}

在你的原始代码中

A *a;
pop(&stack,a);

a 不会被 pop 函数修改。如果您希望修改 a,则必须将指向 a指针传递给 pop 函数,因为它是在我修改后的代码中完成。

关于当我使用 A* 获取 void * 值并打印它时命令终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35769970/

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