Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C树节点指针使用全局变量更改值_C - Fatal编程技术网

C树节点指针使用全局变量更改值

C树节点指针使用全局变量更改值,c,C,故事是这样的。我正在尝试创建一个递归下降解析器,该解析器标记一个字符串,然后用这些标记创建一个节点树 我的主要课程的所有指针都在工作。。。如果您以前使用过RDP,那么您就知道我在用program->statement->assignStmt。。。其思想是程序节点有一个子节点指向语句节点,等等 问题出在这里。当我到达treenode的末尾时,我将指向标记器从字符串创建的实际标记 假设字符串是: firstvar = 1; 在这种情况下,有4个令牌[{id}firstvar]、{assignme

故事是这样的。我正在尝试创建一个递归下降解析器,该解析器标记一个字符串,然后用这些标记创建一个节点树

我的主要课程的所有指针都在工作。。。如果您以前使用过RDP,那么您就知道我在用program->statement->assignStmt。。。其思想是程序节点有一个子节点指向语句节点,等等

问题出在这里。当我到达treenode的末尾时,我将指向标记器从字符串创建的实际标记

假设字符串是:

 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语言中,当你将值传递给函数时,你是通过值传递它们,而不是通过引用传递,这意味着函数会生成该参数的本地副本,并且它只会使用该本地副本,问题是,所有更改只会影响本地副本,当函数终止时,如果处理不正确,所有更改都将丢失。

您正在返回一个指向全局变量的指针,即使您修改了全局变量,该指针也将始终相同


解决方案是每次分配一个新对象,或者根本不使用指针,直接返回结构,让编译器处理结构内部值的复制。

您返回一个指向全局变量的指针,即使修改全局变量,该指针也将始终相同


解决方案是每次分配一个新对象,或者根本不使用指针,直接返回结构,让编译器处理结构内部值的复制。

您是否尝试过使用调试程序?您应该实现解析器,使其内部有自己的逻辑-不要尝试将源代码1:1映射到AST。@H2CO3-Huh?你是什么意思?你说
getNextToken
返回一个指向全局变量的指针?但是您是否在每次调用中更改该变量的内容,但仍然返回相同的指针?在这种情况下,指针将是相同的,并指向完全相同的对象。听起来像是
getNextToken
中的某个东西。你能告诉我们这里发生了什么吗?你试过使用调试程序吗?你应该实现解析器,使其内部有自己的逻辑-不要试图将源代码1:1映射到AST。@H2CO3哈?你是什么意思?你说
getNextToken
返回一个指向全局变量的指针?但是您是否在每次调用中更改该变量的内容,但仍然返回相同的指针?在这种情况下,指针将是相同的,并指向完全相同的对象。听起来像是
getNextToken
中的某个东西。你能告诉我们里面发生了什么吗?嗯。。。所以,我很困惑。代码是这样的吗?我该怎么改变呢?嗯。。。所以,我很困惑。代码是这样的吗?我该如何改变它?