下面是故事。我正在尝试创建一个递归下降语法分析器,它将字符串标记化,然后用这些标记创建一个节点树。
我主要课程的所有指针都在起作用。。。如果您以前使用过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中,当您将值传递给函数时,您是通过值而不是通过引用来传递值,这意味着该函数会生成该参数的本地副本,并且它只能与该本地副本一起工作,问题是所有更改都只会影响本地副本,当函数终止时,如果您不正确处理,所有更改都将丢失。
您正在返回一个指向全局变量的指针,即使您修改了全局变量,该指针也将始终相同。
解决方案是每次分配一个新对象,或者根本不使用指针,直接返回结构,并让编译器处理结构内部值的复制。