Как установить символ внутри структуры на C?

StackOverflow https://stackoverflow.com/questions/1024030

  •  06-07-2019
  •  | 
  •  

Вопрос

Как мне выделить память для переменной 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(), - это верно?И как мне это исправить?

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

Редактировать

Следуя совету ocdecio, я создал указатель на двумерный массив, чтобы получить динамический трехмерный массив.
Моя цель - создать "таблицу", подобную этой:

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

Где количество строк является динамическим, но это всегда массив из 2 строк по 10 символов.

Итак, теперь это то, что я делаю в main:

    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

Что случилось?

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

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

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

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

перераспределить(NovoEstado->instrucao, i+1*sizeof(символ[2][10]));

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

узел структуры typedef{ символ rotulo[10], инструктаж [1][2][10], Отметить;

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top