c - 堆栈和引用传递

标签 c struct scope stack pass-by-reference

假设我有这个结构。

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);

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

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

最佳答案

您没有在 top_funcpop_func 中使用任何 ret。你只是在做一个本地作业,返回时会被丢弃。如果你想使用ret 返回一些东西,那么你需要分配给*ret。所以你需要添加一个间接级别,使其成为一个Symbol **,然后在调用时传递f的地址。然后函数可以分配给 *ret 并且 f 将在调用者中更新。 –

关于c - 堆栈和引用传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37542457/

相关文章:

c++ - C/C++ : Converting hexadecimal value in char to integer

c - 为什么位字段的类型会影响包含结构的大小?

c - 访问存储在双向链表结构中的数据?

c - C语言中struct和array的本质区别

c# - 多线程和 lambda 变量范围

c++ - 令人困惑的 C++ 全局范围问题

c - C 中使用分隔符分割字符串

c - 在C中绘制像素

c - 当结构体包含字符串时为其分配内存

javascript - jquery:从ajax调用获取父元素