Question

Comment allouer de la mémoire à une variable char (et non à un pointeur char) dans une structure?
(Les noms de variable sont en portugais, désolé si c'est un peu déroutant)

J'ai cette structure:

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;

Et c'est la fonction insere () qui définit les valeurs lues depuis un fichier d'entrée dans un nouveau noeud:

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

Ce NovoEstado- > flag = flag; ne fonctionne pas ...
Juste après que je l’ai défini, si j’imprime NovoEstado- > flag , j’obtiens la bonne valeur, mais si je le mets après ce pour avant la fin de la fonction, lorsque J'imprime NovoEstado- > drapeau Je reçois le premier caractère de NovoEstado- > rotulo ...
La même chose se produit lorsque j'essaie d'imprimer flag dans main () ...

Je suppose que c'est parce que je n'alloue pas correctement l'espace mémoire à indicateur dans Insere () , est-ce exact? Et comment puis-je résoudre ce problème?

Je suis à peu près sûr que la question est terriblement facile et que je le savais déjà une fois, mais j'ai oublié et je ne peux la trouver nulle part ... Toute aide serait donc très appréciée

MODIFIER

Suivant le conseil d’ocdecio, j’ai créé un pointeur sur un tableau à deux dimensions afin d’obtenir un tableau à trois dimensions dynamique.
Mon objectif est d’avoir une "table". comme ceci:

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

Où le nombre de lignes est dinamique, mais toujours un tableau de 2 chaînes de 10 caractères.

Alors maintenant, voici ce que je suis en train de faire:

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

Mais ça ne marche pas ...
C'est l'entrée lue à partir du fichier

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

mais avant même d'appeler Insere , je n'attribue pas les bonnes valeurs à instrucao comme je le souhaite, car il s'agit du résultat de printf

123
454
789

au lieu de ce que je vise

123
456
789

Qu'est-ce qui ne va pas?

(avant que quelqu'un ne le demande, cela fait partie d'un devoir, mais ce n'est pas le devoir . Ma tâche consiste à créer un minimiseur d'Automates finis déterministes, il ne s'agit que d'un bogue. Je commence à être lié à la saisie de données)

Merci beaucoup

Était-ce utile?

La solution

Votre problème est susceptible d'être dans cette ligne:

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

Il n'est pas nécessaire d'allouer quoi que ce soit à l'intérieur de votre structure car le champ instrucao est défini de manière statique par l'instruction instrucao [1] [2] [10] , c'est-à-dire pas une structure allouée dynamiquement.

Autres conseils

Je pense que cette ligne est le problème:

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

Dans la structure, l'instrucao est défini comme un bloc de mémoire continue, mais vous allouez maintenant une mémoire et assignez le pointeur.

Essayez de le commenter, vous n'avez pas besoin d'allouer de la mémoire pour cette variable.

Vous n'avez pas besoin d'allouer d'indicateur. C'est un caractère défini dans la structure (comme opposé à un pointeur).

Votre erreur est provoquée par le remplacement du contenu de l'indicateur dans la structure au cours de la boucle for où vous écrivez dans NovoEstado- > instrucao (c'est-à-dire qu'il s'agit d'un gribouillage ou d'un écrasement de mémoire).

Mise à jour: comme @ocdecio le souligne, il n'est pas nécessaire de réallouer à l'intérieur de la boucle, car instrucao est également alloué de manière statique.

Je ne connais pas l'intention du code, mais il est illégal de faire ce qui suit:

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

En gros, la structure qui le contenait a été allouée à l’aide de malloc, mais le membre interne en question est un tableau défini de manière statique et ne peut pas être rellocalisé à l’aide du tas (car le gestionnaire de tas suit uniquement le pointeur pointé au nœud).

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

Si vous souhaitez redimensionner dynamiquement instrucao , vous devez le définir en tant que type de pointeur et allouer de la mémoire séparément.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top