C用全局变量改变值的树指针

  • 本文关键字:指针 改变 全局变量 c
  • 更新时间 :
  • 英文 :


下面是故事。我正在尝试创建一个递归下降语法分析器,它将字符串标记化,然后用这些标记创建一个节点树。

我主要课程的所有指针都在起作用。。。如果您以前使用过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中,当您将值传递给函数时,您是通过值而不是通过引用来传递值,这意味着该函数会生成该参数的本地副本,并且它只能与该本地副本一起工作,问题是所有更改都只会影响本地副本,当函数终止时,如果您不正确处理,所有更改都将丢失。

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

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

最新更新