首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >堆栈和引用传递

堆栈和引用传递
EN

Stack Overflow用户
提问于 2016-05-31 09:54:25
回答 2查看 72关注 0票数 0

假设我有这个结构。

代码语言:javascript
复制
typedef struct Symbol {
    char* name;
    /* Other variables declared here... */
    struct Symbol *next;
}Symbol;

我想要做的是在堆栈中插入一些这些符号。除了其他的the,这些符号将被插入。因此,我创建了一个func类型的结构来处理堆栈,如下所示:

代码语言:javascript
复制
typedef struct func{
    Symbol* sym; 
    struct func* next
}func;

并声明了一个指向堆栈func* funcstack;的指针,该指针将用作我的堆栈的head

现在,处理堆栈操作的函数如下

代码语言:javascript
复制
/**
 * @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

代码语言:javascript
复制
Symbol* f = malloc(sizeof(Symbol));
f->name = strdup("Hello");
funcstack = push_func(funcstack, f);

在我的实现过程中,我像这样调用toppop

代码语言:javascript
复制
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-referencecall-by-value,在处理自声明的数据类型时我无法理解这一点。我使用C作为我的实现语言。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-31 11:22:15

您没有在top_funcpop_func中使用任何pop_func。您只是在执行本地任务,返回时就会丢弃它。如果希望使用ret返回某项内容,则需要将其分配给*ret。因此,您需要添加一个间接级别,以便它是一个Symbol **,然后在打电话时传递f的地址。然后,函数可以分配给*retf将在调用方中更新。-

票数 3
EN

Stack Overflow用户

发布于 2016-05-31 10:07:54

这只是@TomKarze回答的一个转贴

您不能在top_func和pop_func中使用ret。您只是在执行本地任务,返回时就会丢弃它。如果您希望使用ret返回某项内容,则需要将其分配给*ret。因此,您需要添加一个间接级别,以便它是一个符号**,然后在调用时传递f的地址。然后,函数可以分配给*ret,而f将在调用方中更新。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37542457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档