Как мне выделить память для переменной типа char (не указателя char) внутри структуры?
(Названия переменных на португальском, извините, если это немного запутанно)
У меня есть такая структура:
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;
И это функция insere()
, которая устанавливает значения, считанные из входного файла в новом узле:
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]);
}
}
Это NovoEstado->flag = flag;
не работает ...
Сразу после того, как я установил его, если я напечатаю NovoEstado->flag
, я получу правильное значение, но если я поставлю его после этого for
к концу функции, когда я напечатаю NovoEstado->flag
, я получу первый символ NovoEstado-> rotulo ...
То же самое происходит, когда я пытаюсь напечатать flag
в main()
...
Я полагаю, это потому, что я неправильно распределяю пространство памяти для flag
в Insere()
, это верно? И как мне это исправить?
Я почти уверен, что это ужасно простой вопрос, и что я, возможно, знал это однажды, но я забыл и нигде не могу его найти ... Так что любая помощь будет очень признательна
EDIT
Следуя совету ocdecio, я создал указатель на двумерный массив, чтобы иметь динамический трехмерный массив.
Моя цель - создать такой «стол»:
10 chars | 10 chars
|__________|__________|
|__________|__________|
|__________|__________|
Где число строк является динамическим, но это всегда массив из 2 строк по 10 символов.
Итак, вот что я делаю в основном:
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);
Но это не работает ...
Это входные данные, прочитанные из файла
adsasdfg2: (abc,123) (def,456) (ghi,789);
но даже до того, как я позвоню Insere
, я не назначаю правильные значения для instrucao
так, как хочу, так как это вывод этого printf
123
454
789
вместо того, к чему я стремлюсь
123
456
789
Что не так?
(прежде чем кто-то спросит, это часть домашнего задания, но не домашнее задание. Моя задача - сделать минимизатор детерминированных конечных автоматов, это всего лишь ошибка, которую я м становится связанным с вводом данных)
Большое спасибо