¿Cómo configurar un carácter dentro de una estructura en C?
-
06-07-2019 - |
Pregunta
¿Cómo asigno memoria para una variable char (no un puntero char) dentro de una estructura?
(Los nombres de las variables están en portugués, lo siento si es un poco confuso)
Tengo esta estructura:
typedef struct node{
char rotulo[10], instrucao[1][2][10], flag;
int simplificado;
struct node *referencias[2];
struct node **antecessores;
int nrAntecessores;
struct node *ant;
struct node *prox;
} Estado;
Y esta es la función insere ()
que establece los valores leídos de un archivo de entrada en un nuevo nodo:
void Insere(char *rotulo, char instrucao[][2][10], int qtdInstrucao, char flag){
int i,j;
Estado *NovoEstado;
NovoEstado = (Estado*)malloc(sizeof(Estado));
NovoEstado->prox = NULL;
NovoEstado->ant = P->ult;
strcpy(NovoEstado->rotulo, rotulo);
NovoEstado->flag = flag;
NovoEstado->antecessores = NULL;
NovoEstado->nrAntecessores = 0;
NovoEstado->simplificado = 0;
for(i=0;i<qtdInstrucao;i++){
realloc(NovoEstado->instrucao, i+1*sizeof(char[2][10]));
strcpy(NovoEstado->instrucao[i][0], instrucao[i][0]);
strcpy(NovoEstado->instrucao[i][1], instrucao[i][1]);
}
}
Este NovoEstado- > flag = flag;
no funciona ...
Justo después de configurarlo, si imprimo NovoEstado- > flag
obtengo el valor correcto, pero si lo pongo después de eso for
al final de la función, cuando Imprimo NovoEstado- > flag
obtengo el primer char de NovoEstado- > rotulo ...
Lo mismo sucede cuando intento imprimir flag
en main ()
...
Supongo que es porque no estoy asignando correctamente el espacio de memoria a flag
en Insere ()
, ¿es así? ¿Y cómo lo soluciono?
Estoy bastante seguro de que es una pregunta tremendamente fácil, y que posiblemente lo supe una vez, pero lo olvidé y no puedo encontrarlo en ningún lado ... Entonces cualquier ayuda sería muy apreciada
EDIT
Siguiendo la sugerencia de ocdecio, creé un puntero a una matriz bidimensional para tener una matriz dinámica de 3 dimensiones.
Mi objetivo es tener una '' mesa '' así:
10 chars | 10 chars
|__________|__________|
|__________|__________|
|__________|__________|
Donde el número de líneas es dinámico, pero siempre es una matriz de 2 cadenas de 10 caracteres.
Entonces, esto es lo que estoy haciendo en main:
char estado[127], rotulo[10], strInstrucoes[117], *conjunto = calloc(21, sizeof(char)), flag;
char (*instrucao)[2][10];
FILE * entrada;
Automato *Aut = (Automato*)malloc(sizeof(Automato));
if((entrada = fopen(argv[1], "r")) != NULL){
CriaAutomato(Aut);
while(fgets(estado, 127, entrada)){
flag = 0;
sscanf(estado,"%[^:]: %[^;]; %c", rotulo, strInstrucoes, &flag);
instrucao = calloc(1, sizeof(char[2][10]));
conjunto = strtok(strInstrucoes,"() ");
for(i = 0; conjunto != NULL; i++){
realloc(instrucao, i+1*sizeof(char[2][10]));
sscanf(conjunto,"%[^,],%s", instrucao[i][0], instrucao[i][1]);
printf("%s || %d\n", instrucao[i][1], i);
conjunto = strtok(NULL, "() ");
}
Insere(Aut, rotulo, instrucao, i, flag);
free(instrucao);
}
fclose(entrada);
Pero esto no está funcionando ...
Esta es la entrada leída del archivo
adsasdfg2: (abc,123) (def,456) (ghi,789);
pero incluso antes de llamar a Insere
no estoy asignando los valores correctos a instrucao
de la manera que quiero, ya que esta es la salida de ese printf
123
454
789
en lugar de lo que busco
123
456
789
¿Qué pasa?
(antes de que alguien pregunte, esto es parte de una tarea, pero no la tarea . Mi tarea es hacer un minimizador de autómatas finitos deterministas, esto es solo un error Me estoy relacionando con la entrada de datos)
Muchas gracias
Solución
Es probable que su problema esté en esta línea:
realloc(NovoEstado->instrucao, i+1*sizeof(char[2][10]));
No es necesario asignar nada dentro de su estructura porque el campo instrucao
está estáticamente definido por la instrucción instrucao [1] [2] [10]
, es no es una estructura asignada dinámicamente.
Otros consejos
Creo que esta línea es el problema:
realloc(NovoEstado->instrucao, i+1*sizeof(char[2][10]));
En la estructura, el instrucao se define como un trozo de memoria continua, pero ahora está asignando una memoria y asignando el puntero.
Intente comentarlo, no necesita asignar memoria para esa variable.
No necesita asignar bandera. Es un carácter definido dentro de la estructura (como opuesto a un puntero).
Su error es causado al sobrescribir el contenido de la bandera dentro de la estructura durante el ciclo for donde escribe a NovoEstado- > instrucao
(es decir, es un garabato o sobrescritura de memoria).
Actualización: como señala @ocdecio, no es necesario reasignar dentro del bucle, ya que instrucao
también está estáticamente asignado.
No sé la intención del código, pero ciertamente es ilegal hacer lo siguiente:
realloc (NovoEstado- > instrucao, i + 1 * sizeof (char [2] [10]));
Básicamente, la estructura que contiene se asignó usando malloc, pero el miembro interno en cuestión es una matriz estáticamente definida y no se puede reasignar usando el montón (porque el administrador del montón solo rastrea el puntero mallocado al nodo).
typedef struct node {char rotulo [10], instrucao [1] [2] [10], flag;
Si desea cambiar el tamaño de instrucao dinámicamente, debe definirlo como un tipo de puntero y asignarle memoria por separado.