假设我有这个结构。
typedef struct Symbol {
char* name;
/* Other variables declared here... */
struct Symbol *next;
}Symbol;
我想做的是将这些 Symbol 中的一些插入堆栈中。除了其他 A.D.T.这些 Symbol 将被插入。
因此,出于这个原因,我创建了一个 func
类型的结构来处理我的堆栈,如下所示:
typedef struct func{
Symbol* sym;
struct func* next
}func;
并声明了一个指向堆栈 func* funcstack;
的指针,它将作为我的堆栈的头。
现在,处理堆栈操作的函数如下
/**
* @brief
*/
func* push_func(func* head, Symbol* ret) {
func* tmp = (func*)malloc(sizeof(func));
if (!tmp) {
fprintf(stderr, "push_func: Allocation error!\n");
exit(-1);
}
tmp->sym = ret;
tmp->next = head;
head = tmp;
return head;
}
/**
* @brief
*/
func* pop_func(func* head, Symbol* ret) {
if (!head) {
printf("pop_func: Trying to pop from empty funcstack!!\n");
exit(-1);
}
func* tmp = head;
ret = head->sym;
head = head->next;
free(tmp);
return head;
}
/**
* @brief
*/
func* top_func(func* head, Symbol* ret) {
if (!head) {
printf("top_func: Trying to top from empty funcstack!!\n");
exit(-1);
}
else {
ret = head->sym;
return head;
}
}
到此为止,我想澄清一下我的实现是否正确。虽然,我认为肯定缺少某些东西。
我这样调用push
:
Symbol* f = malloc(sizeof(Symbol));
f->name = strdup("Hello");
funcstack = push_func(funcstack, f);
在我的实现过程中,我像这样调用 top
和 pop
:
Symbol* f;
funcstack = top_func(funcstack, f);
funcstack = pop_func(funcstack, f);
出于测试目的,我在该点下方添加了 printf("f->name = %s", f->name);
。从理论上讲,在这一点上,f
应该指向一个特定的符号,因为我的堆栈不应该在被称为.所以我希望我的 printf()
打印这样的东西:f->name = hello
但是我得到的是 garbage (f->name = �E �)
为什么会这样?我该如何解决这个问题?我认为答案在于 call-by-reference
和 call-by-value
,我在处理自声明数据类型时无法理解。我使用 C 作为我的实现语言。
最佳答案
您没有在 top_func
和 pop_func
中使用任何 ret
。你只是在做一个本地作业,返回时会被丢弃。如果你想使用ret
返回一些东西,那么你需要分配给*ret
。所以你需要添加一个间接级别,使其成为一个Symbol **
,然后在调用时传递f
的地址。然后函数可以分配给 *ret
并且 f
将在调用者中更新。 –
关于c - 堆栈和引用传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37542457/