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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top