Como definir um char dentro de um struct em C?
-
06-07-2019 - |
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
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],
Se você deseja redimensionar para Instrução dinamicamente, você deve defini-lo como um tipo de ponteiro e alocar memória para ele separadamente.