假设我有这个结构。
typedef struct Symbol {
char* name;
/* Other variables declared here... */
struct Symbol *next;
}Symbol;我想要做的是在堆栈中插入一些这些符号。除了其他的the,这些符号将被插入。因此,我创建了一个func类型的结构来处理堆栈,如下所示:
typedef struct func{
Symbol* sym;
struct func* next
}func;并声明了一个指向堆栈func* funcstack;的指针,该指针将用作我的堆栈的head。
现在,处理堆栈操作的函数如下
/**
* @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,但是我得到了垃圾(f->name =�E�)
为什么会发生这种情况?我怎么才能解决这个问题呢?我认为答案在于call-by-reference和call-by-value,在处理自声明的数据类型时我无法理解这一点。我使用C作为我的实现语言。
发布于 2016-05-31 11:22:15
您没有在top_func和pop_func中使用任何pop_func。您只是在执行本地任务,返回时就会丢弃它。如果希望使用ret返回某项内容,则需要将其分配给*ret。因此,您需要添加一个间接级别,以便它是一个Symbol **,然后在打电话时传递f的地址。然后,函数可以分配给*ret,f将在调用方中更新。-
发布于 2016-05-31 10:07:54
这只是@TomKarze回答的一个转贴
您不能在top_func和pop_func中使用ret。您只是在执行本地任务,返回时就会丢弃它。如果您希望使用ret返回某项内容,则需要将其分配给*ret。因此,您需要添加一个间接级别,以便它是一个符号**,然后在调用时传递f的地址。然后,函数可以分配给*ret,而f将在调用方中更新。
https://stackoverflow.com/questions/37542457
复制相似问题