Как установить символ внутри структуры в C? - PullRequest
1 голос
/ 21 июня 2009

Как мне выделить память для переменной типа 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

Что не так?

(прежде чем кто-то спросит, это часть домашнего задания, но не домашнее задание. Моя задача - сделать минимизатор детерминированных конечных автоматов, это всего лишь ошибка, которую я м становится связанным с вводом данных)

Большое спасибо

Ответы [ 4 ]

7 голосов
/ 21 июня 2009

Ваша проблема, вероятно, в этой строке:

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

Нет необходимости выделять что-либо внутри вашей структуры, поскольку поле instrucao статически определяется оператором instrucao[1][2][10], оно не является динамически распределенной структурой.

1 голос
/ 21 июня 2009

Я думаю, что эта строка является проблемой:

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

В структуре Instrucao определен как кусок непрерывной памяти, но теперь вы выделяете память и назначаете указатель.

Попробуйте закомментировать, вам не нужно выделять память для этой переменной.

0 голосов
/ 21 июня 2009

Я не знаю намерения кода, но, безусловно, запрещено делать следующее:

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

По сути, содержащая структура была выделена с использованием malloc, но рассматриваемый внутренний элемент является статически определенным массивом, и его нельзя переместить с помощью кучи (поскольку диспетчер кучи отслеживает только неверный указатель на узел).

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

Если вы хотите динамически изменить размер instrucao , вы должны определить его как тип указателя и выделить для него память отдельно.

0 голосов
/ 21 июня 2009

Вам не нужно выделять флаг. Это символ, определенный внутри структуры (в отличие от указателя).

Ваша ошибка вызвана перезаписью содержимого флага внутри структуры во время цикла for, когда вы записываете в NovoEstado->instrucao (т.е. это перезапись памяти или перезапись).

Обновление: как указывает @ocdecio, вам не нужно перераспределять внутри цикла, так как instrucao также статически выделяется.

...