C Treenode 指针用全局变量改变值

标签 c

所以,这是故事。我正在尝试创建一个递归下降解析器,它标记一个字符串,然后从这些标记中创建一个节点树。

我的主要类(class)的所有指针都在工作......如果你之前使用过 RDP 那么你知道我在说什么程序 -> 语句 -> assignStmt...等。这个想法是程序节点有一个指向语句节点的子节点,等等。

问题来了。当我到达树节点的末尾时,我指向的是分词器从字符串创建的实际分词。

所以,假设字符串是:

 firstvar = 1;

在这种情况下,有 4 个标记 [{id} firstvar]、[{assignment} =]、[{number} 1]、[{scolon}]

我希望我的 assignStmt 节点指向该语句的非装饰器部分..即,assignStmt 的 child1 将是 [{id} firstvar],child2 将是 [{number} 1]...

然而。当我将 child1 分配给 [{id} firstvar],然后继续处理下一个标记时,child1 的值会随着我向前移动而改变。因此,如果我将我的全局标记更改为下一个标记(在本例中为 [{assignment} =] ),那么 assignStmt 的 child1 也会随之更改。

这是为什么?我能做些什么?!谢谢你!

TOKEN* getNextToken(void); 
//only shown here to you know the return... it's working properly elsewhere

typedef struct node {
    TOKEN *data;

    struct node *child1, *child2, *child3, *child4, *parent;

} node;

TOKEN *token;
Symbol sym;
struct node *root;

void getsym() 
{
    token = getNextToken();
    sym = token->sym;
}

int main()
{
    getsym();
    //So, right now, from getsym() the global token has the value {identifier; firstvar} 

    struct node* tempNode;
    tempNode = (struct node*) calloc(1, sizeof(struct node));
    tempNode->child1 = tempNode->child2 = tempNode->child3 = tempNode->child4 =  NULL;
    tempNode->data = token;

    getsym();
    //BUT NOW from getsym() the global token has the value {assignment; =}, and 
    //subsequently the tempNode->data has changed from what it should be 
    //{identifier; firstvar} to what the global token's new value is: {assignment; =}

}

最佳答案

由于我的声誉不佳,我无法对此发表评论,因此我将添加这个答案,如果理解了您的问题,您可能正在传递一个指向函数的指针,而问题是您可能需要一个指向指针的指针只是一个指针。

在 C 中,当您将值传递给函数时,您是按值而不是按引用传递它们,这意味着该函数会创建该参数的本地副本,并且它只能使用该本地副本,问题在于所有更改只会影响本地副本,当函数终止时,如果您不正确处理,所有更改都将丢失。

关于C Treenode 指针用全局变量改变值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12828477/

相关文章:

c - 链表 : How to Sort Doubly Linked List?

c++ - LLVM-IR 数组指针赋值

c - 逐行读取文件 - 文件在哪里?

c++ - 用于 C++(或 C)的 mmap 可加载数据结构库

c++ - 一个静态变量到多个拷贝

c - 不使用 vector 、指针和计数排序的桶排序实现

c - Windows 10 中的原始 UDP 套接字导致网络问题

c - 我想明确了解打印类型

c++ - 原生显卡功能

c - sscanf() 如何查看字符串中的数字?