C punteros Treenode cambiando valores con globales

Entonces, aquí está la historia. Estoy tratando de crear un analizador de descenso recursivo que tokeniza una cadena y luego crea un árbol de nodos a partir de esos tokens.

Todos los indicadores para mis clases principales están funcionando … si ha trabajado con un RDP antes, entonces sabe de lo que estoy hablando con el progtwig -> statement -> assignStmt … etc. La idea es que el progtwig El nodo tiene un hijo que apunta al nodo de statement, etc.

Aquí está el problema. Cuando llego al final del treenode, estoy apuntando a los tokens reales que el tokenizador creó a partir de la cadena.

Entonces, digamos que la cadena es:

firstvar = 1; 

En este caso hay 4 tokens [{id} firstvar], [{asignación} =], [{número} 1], [{scolon}]

Y quiero que mi nodo assignStmt apunte a las partes no decoradoras de esa statement … a saber, child1 de assignStmt sería [{id} firstvar] y child2 sería [{number} 1] …

SIN EMBARGO. Cuando asigno child1 a [{id} firstvar], y luego avanzo hacia los siguientes tokens, el valor de child1 cambia a medida que avanzo. Por lo tanto, si cambio mi token global al siguiente token (en este caso [{asignación} =]), entonces child1 del assignStmt cambia con él.

¿Por qué es esto? ¡¿Que puedo hacer?! ¡Gracias!

 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; =} } 

Está devolviendo un puntero a una variable global, y ese puntero siempre será el mismo incluso si modifica la variable global.

La solución es asignar un nuevo objeto cada vez, o no usar punteros en absoluto y devolver la estructura directamente y dejar que el comstackdor maneje la copia de los valores internos de la estructura.

Como no puedo comentar sobre esto debido a mi baja reputación, agregaré esta respuesta y, si he entendido su problema, probablemente esté pasando un puntero a una función, y el problema es que probablemente necesite un puntero para apuntar en lugar de solo un puntero.

en C, cuando pasa valores a una función, los pasa por valor, no por referencia, lo que significa que la función hace una copia local de ese argumento y funcionará solo con esa copia local, el problema es que todos los cambios afectarán solo la copia local y cuando la función termine, todos los cambios se perderán si no lo maneja correctamente.