所以,这是故事。我正在尝试创建一个递归下降解析器,它标记一个字符串,然后从这些标记中创建一个节点树。
我的主要类(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/