Pergunta

Como faço para alocar memória para uma variável char (não um ponteiro de char) dentro de um struct?
(Os nomes de variáveis ??estão em português, desculpe se é meio confuso)

Eu tenho este struct:

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 esta é a função insere() que os valores conjuntos de ler a partir de um arquivo de entrada em um novo nó:

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

Esta NovoEstado->flag = flag; não está funcionando ...
Logo depois que eu defini-lo, se eu imprimir NovoEstado->flag i obter o valor certo, mas se eu colocá-lo depois que for até o final da função, quando eu imprimir NovoEstado->flag eu recebo o primeiro caractere de NovoEstado-> rotulo ...
O mesmo acontece quando tento imprimir flag em main() ...

Eu acho que é porque eu não estou alocar adequadamente espaço de memória para flag em Insere(), não é mesmo? E como faço para corrigir isso?

Eu tenho certeza que é uma pergunta fácil horrível, e que eu possibily sabia que isso uma vez, mas eu esqueci e não pode encontrá-lo em qualquer lugar ... Assim, qualquer ajuda seria muito apreciada

Editar

A seguir ponta do ocdecio eu criei um ponteiro para uma matriz bidimensional, a fim de ter uma matriz dimensional dinâmica 3.
Meu objetivo é ter uma "mesa" como esta:

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

Quando o número de linhas é dinâmica, mas é sempre um conjunto de 2 cordas de 10 caracteres.

Então, agora isso é o que estou fazendo no principal:

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

Mas isso não está funcionando ...
Esta é a entrada lida a partir do arquivo

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

Mas mesmo antes que eu chame Insere Não estou atribuindo os valores corretos para instrucao do jeito que eu quero, pois esta é a saída do printf

123
454
789

em vez do que eu estou apontando para

123
456
789

O que há de errado?

(Antes que alguém pergunte, este é parte de um dever de casa, mas não o lição de casa. A minha tarefa é fazer uma determinística Finite Automata minimizador, este é apenas um bug estou ficando relacionadas com a entrada de dados)

Graças um lote inteiro

Foi útil?

Solução

Seu problema é provável que seja nesta linha:

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

Não há necessidade de alocar qualquer coisa dentro de sua estrutura porque o instrucao campo é estaticamente definido pelo instrucao[1][2][10] declaração, não é uma estrutura alocada dinamicamente.

Outras dicas

Eu acho que esta linha é o problema:

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

Na estrutura da Instrução é definido como um pedaço de memória contínua, mas agora você está alocando uma memória e atribuir o ponteiro.

Tente comentar isso, você não precisa alocar memória para essa variável.

Você não precisa alocar bandeira. É um char definido dentro da estrutura (como se opor a um ponteiro).

O seu erro é causado por sobrescrever o conteúdo de bandeira dentro da estrutura durante o loop onde você escreve para NovoEstado->instrucao (ou seja, seu um rabisco de memória ou substituir).

Update:. Como @ocdecio pontos fora, você não precisa realocar dentro do loop, como instrucao também é alocado estaticamente

Eu não sei a intenção do código, mas certamente é ilegal fazer o seguinte:

realocar (NovoEstado-> Instrução, i + 1 * sizeof (char [2] [10]));

Basicamente, a estrutura contendo foi atribuída utilizando malloc, mas o interior membro em questão é uma matriz estaticamente definidos e que não pode ser rellocated utilizando a pilha (porque as faixas gestor da pilha apenas o ponteiro malloced ao nó).

typedef struct nó {char rotulo [10], Instrução [1] [2] [10], bandeira;

Se você deseja redimensionar para Instrução dinamicamente, você deve defini-lo como um tipo de ponteiro e alocar memória para ele separadamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top