Domanda

Come posso allocare memoria per una variabile char (non un puntatore char) all'interno di una struttura?
(I nomi delle variabili sono in portoghese, scusate se è un po 'confuso)

Ho questa struttura:

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;

E questa è la funzione insere () che imposta i valori letti da un file di input in un nuovo 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]);
    }
}

Questo NovoEstado- > flag = flag; non funziona ...
Subito dopo averlo impostato, se stampo NovoEstado- > flag ottengo il valore giusto, ma se lo metto dopo quel per entro la fine della funzione, quando Stampo NovoEstado- > flag Ottengo il primo carattere di NovoEstado- > rotulo ...
Lo stesso succede quando provo a stampare flag in main () ...

Immagino sia perché non sto allocando correttamente lo spazio di memoria su flag in Insere () , giusto? E come posso ripararlo?

Sono abbastanza sicuro che sia una domanda orribile e facile, e che forse lo sapevo una volta, ma l'ho dimenticato e non riesco a trovarlo da nessuna parte ... Quindi qualsiasi aiuto sarebbe molto apprezzato

Modifica

Seguendo la punta di ocdecio ho creato un puntatore a un array bidimensionale, al fine di avere un array tridimensionale dinamico.
Il mio obiettivo è di avere una "tabella" in questo modo:

  10 chars | 10 chars  
|__________|__________|
|__________|__________|
|__________|__________|

Dove il numero di righe è dinamico, ma è sempre una matrice di 2 stringhe di 10 caratteri.

Quindi ora questo è quello che sto facendo in generale:

    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);

Ma questo non funziona ...
Questo è l'input letto dal file

adsasdfg2: (abc,123) (def,456) (ghi,789);

ma anche prima di chiamare Insere non sto assegnando i valori giusti a instrucao come voglio, poiché questo è l'output di quel printf

123
454
789

invece di ciò a cui sto puntando

123
456
789

Cosa c'è che non va?

(prima che qualcuno chieda, questa è parte di un compito a casa, ma non i compiti . Il mio compito è quello di creare un minimizzatore di automi finiti deterministico, questo è solo un bug Mi sto relazionando con l'inserimento dei dati)

Grazie mille

È stato utile?

Soluzione

È probabile che il tuo problema sia in questa riga:

realloc(NovoEstado->instrucao, i+1*sizeof(char[2][10]));

Non è necessario allocare nulla all'interno della struttura perché il campo instrucao è staticamente definito dall'istruzione instrucao [1] [2] [10] , è non una struttura allocata dinamicamente.

Altri suggerimenti

Penso che questa linea sia il problema:

realloc(NovoEstado->instrucao, i+1*sizeof(char[2][10]));

Nella struttura l'istrucao è definito come un pezzo di memoria continua ma ora stai allocando una memoria e assegnando il puntatore.

Prova a commentarlo, non è necessario allocare memoria per quella variabile.

Non è necessario allocare flag. È un carattere definito all'interno della struttura (al contrario di un puntatore).

Il tuo errore è causato dalla sovrascrittura del contenuto del flag all'interno della struttura durante il ciclo for in cui scrivi a NovoEstado- > instrucao (ovvero è uno scarabocchio di memoria o sovrascrivi).

Aggiornamento: come sottolinea @ocdecio, non è necessario riallocare all'interno del ciclo, poiché anche instrucao è allocato staticamente.

Non conosco l'intento del codice, ma è certamente illegale fare quanto segue:

realloc (NovoEstado- > instrucao, i + 1 * sizeof (char [2] [10]));

Fondamentalmente, la struttura contenente è stata allocata usando malloc, ma il membro interno in questione è un array definito staticamente e non può essere rellociato usando l'heap (perché il gestore heap tiene traccia del puntatore malloced solo sul nodo).

typedef struct node {char rotulo [10], instrucao [1] [2] [10], flag;

Se si desidera ridimensionare instrucao in modo dinamico, è necessario definirlo come un tipo di puntatore e allocare memoria per esso separatamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top