簡體   English   中英

如何在C中的結構內設置字符?

[英]How to set a char inside a struct in C?

如何在結構內為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 ...
當我嘗試在main()打印flag ,也會發生同樣的情況……

我認為這是因為我沒有在Insere()正確分配內存空間來進行flag ,對嗎? 我該如何解決?

我很確定這是一個非常簡單的問題,而且我可能一次也知道這一點,但是我忘記了並且在任何地方都找不到它...所以我們將不勝感激

編輯

遵循ocdecio的技巧,我創建了一個指向二維數組的指針,以便獲得動態3維數組。
我的目標是要有一個像這樣的“桌子”:

  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

怎么了?

(有人問過,這是一門功課的一部分 ,但不是功課。我的任務就是讓一個確定有限自動最小化,這只是我越來越相關數據輸入錯誤)

非常感謝

您的問題可能在以下這一行:

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

不需要在結構內部分配任何內容,因為instrucao字段是由語句instrucao[1][2][10]靜態定義的,它不是動態分配的結構。

我認為這是問題所在:

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

在結構中,instrucao被定義為一塊連續的內存,但是您現在正在分配內存並分配指針。

嘗試注釋掉它,您不需要為該變量分配內存。

您不需要分配標志。 它是在結構內部定義的一個字符(與指針相反)。

您的錯誤是由在for循環中寫入NovoEstado->instrucao的for循環中覆蓋了struct內部標志的內容引起的(即,它的內存NovoEstado->instrucao或覆蓋)。

更新:@ocdecio指出,您不需要在循環內instrucao分配,因為instrucao也是靜態分配的。

我不知道代碼的意圖,但是執行以下操作當然是非法的:

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

基本上,包含結構是使用malloc分配的,但是有問題的內部成員是靜態定義的數組,無法使用堆進行重新分配(因為堆管理器僅跟蹤指向節點的malloc指針)。

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

如果希望動態調整Instrucao的大小, 必須將其定義為指針類型,並分別為其分配內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM