C++ 更改结构中的另一个值后,字符数组长度已更改

C++ 更改结构中的另一个值后,字符数组长度已更改,c++,parsing,unions,C++,Parsing,Unions,所以我在这里遇到了一个奇怪的情况 我正在写一个程序,可以解析布尔表达式和逻辑表达式,比如:(salary*2>10000)和gender='m' 根据本文中的概念,我使用了一个名为Node的结构来表示不同级别的每个操作 我的节点构造是 class Node { int type; union { int i; double f; char c[LINESIZE]; char buf[LINESIZE]; char tname[LINESIZE];

所以我在这里遇到了一个奇怪的情况

我正在写一个程序,可以解析布尔表达式和逻辑表达式,比如:(salary*2>10000)和gender='m'

根据本文中的概念,我使用了一个名为Node的结构来表示不同级别的每个操作

我的节点构造是

class Node {

int type;
union
{
    int i;
    double f;
    char c[LINESIZE];

    char buf[LINESIZE];

    char tname[LINESIZE];
    char attr[LINESIZE];

    struct Node *p[2];  // points to operands of an expression;
    struct Node *q; //
} value;

bool eval_b();
Node* eval_e();
Node* eval_t();
Node* eval_f();
};
value.buf存储实际表达式

enode = T(E_ptr); // Create a TERM Node and parse the next token

if(enode == NULL){
    cout << "Error: T() returns NULL" <<endl;
    return(NULL);
}

while(token_type == '+' || token_type == '-'  )
{
    E_ptr = exp_p; //Move the pointer in the input

    flag++;

    // Initialize a node
    op = (struct Node *) malloc(sizeof(struct Node));

    strcat(op->value.buf, enode->value.buf);

    size_t len;
    if(token_type == '+'){

        op->type = ADD;
        strcat(op->value.buf, " + ");

        // The first len here!!!
        len = strlen(op->value.buf);
        cout << "after + , the len is:" << len << endl;
    }
    else if(token_type == '-'){
        op->type = MINUS;

        strcat(op->value.buf, " - ");
    }

    op->value.p[0] = enode;

    // The second len here!!!
    len = strlen(op->value.buf);
    cout << "before parsing + right , the len is:" << len << endl;

    op->value.p[1] = T(E_ptr);

    strcat(op->value.buf, op->value.p[1]->value.buf);

    if (op->value.p[1] == NULL){
        cout <<"Error: Some expression is expected after '+' or '-'." << endl;
        free(op);
        return(NULL);
    }
    operand = op;
}

if(flag == 0){
    op = (struct Node *) malloc(sizeof(struct Node));
    op->type = EXPRESSION;
    op->value.q = enode;
    strcpy(op->value.buf, enode->value.buf);
    operand = op;
}

return operand;
enode=T(E_ptr);//创建一个术语节点并解析下一个标记
if(enode==NULL){
cout type=ADD;
strcat(op->value.buf,“+”);
//第一个透镜在这里!!!
len=strlen(op->value.buf);
cout value.p[0]=enode;
//第二个透镜在这里!!!
len=strlen(op->value.buf);
cout value.p[1]>value.buf);
如果(op->value.p[1]==NULL){
cout value.buf,enode->value.buf);
操作数=op;
}
返回操作数;
我的输入是高度+0.3>2.0 透镜的长度可以达到9(“高度+”) 但是在我将enode传递给op->value.p[0]之后,len被减少为3。当我打印出来时,它变成“�A.�".


这里出了什么问题?

strcat(op->value.buf,enode->value.buf)
strcat
假定其参数是以字符串结尾的指针。但是,
op->value.buf
是指向随机未初始化垃圾的指针。您可能希望使用一个名为
eval
的虚拟函数的
节点类型层次结构,而不是使用一个具有做任何事情。这将是更容易的理由。<代码> OP>值。P [0 ] = eNoDE;Le= StLLEN(OP>值。BUF);< /代码>在分配给另一个成员之后,你不能读取联盟的成员。只有一个成员在任何给定的时间“活动”-最近分配的一个。尝试写C++而不是C。