C树节点指针使用全局变量更改值
故事是这样的。我正在尝试创建一个递归下降解析器,该解析器标记一个字符串,然后用这些标记创建一个节点树 我的主要课程的所有指针都在工作。。。如果您以前使用过RDP,那么您就知道我在用program->statement->assignStmt。。。其思想是程序节点有一个子节点指向语句节点,等等 问题出在这里。当我到达treenode的末尾时,我将指向标记器从字符串创建的实际标记 假设字符串是:C树节点指针使用全局变量更改值,c,C,故事是这样的。我正在尝试创建一个递归下降解析器,该解析器标记一个字符串,然后用这些标记创建一个节点树 我的主要课程的所有指针都在工作。。。如果您以前使用过RDP,那么您就知道我在用program->statement->assignStmt。。。其思想是程序节点有一个子节点指向语句节点,等等 问题出在这里。当我到达treenode的末尾时,我将指向标记器从字符串创建的实际标记 假设字符串是: firstvar = 1; 在这种情况下,有4个令牌[{id}firstvar]、{assignme
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
中的某个东西。你能告诉我们里面发生了什么吗?嗯。。。所以,我很困惑。代码是这样的吗?我该怎么改变呢?嗯。。。所以,我很困惑。代码是这样的吗?我该如何改变它?