1

構造体内の 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の最初の文字が取得されます...で
印刷しようとしても同じことが起こります...flagmain()

flagにメモリ空間を適切に割り当てていないためだと思いますInsere()が、そうですか?どうすれば修正できますか?

それは非常に簡単な質問であり、おそらくこれを一度知っていたと確信していますが、忘れてしまい、どこにも見つかりません...だから、どんな助けも大歓迎です

編集

ocdecio のヒントに従って、動的な 3 次元配列を作成するために、2 次元配列へのポインターを作成しました。
私の目標は、次のような「テーブル」を持つことです。

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

行数は動的ですが、常に 10 文字の 2 つの文字列の配列です。

だから今、これは私がメインでやっていることです:

    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正しい値を割り当てていませんinstrucaoprintf

123
454
789

目指すものではなく

123
456
789

どうしたの?

(誰かが尋ねる前に、これは宿題の一部ですが宿題ではありません。私の仕事は、決定論的有限オートマトン最小化ツールを作成することです。これは、データ入力に関連して発生する単なるバグです)

どうもありがとう

4

4 に答える 4

7

問題は次の行にある可能性があります。

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

instrucaoフィールドはステートメントによって静的に定義されているため、構造内に何かを割り当てる必要はありinstrucao[1][2][10]ません。動的に割り当てられた構造ではありません。

于 2009-06-21T14:39:14.083 に答える
1

この行が問題だと思います:

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

構造体では、命令は連続したメモリのチャンクとして定義されていますが、現在メモリを割り当ててポインタを割り当てています。

コメントアウトしてみてください。その変数にメモリを割り当てる必要はありません。

于 2009-06-21T14:39:43.630 に答える
0

フラグを割り当てる必要はありません。これは、構造体内で定義された char です (ポインターとは対照的に)。

エラーは、書き込み先の for ループ中に構造体内のフラグの内容を上書きすることによって発生しますNovoEstado->instrucao(つまり、メモリの落書きまたは上書き)。

更新: @ocdecio が指摘しているように、instrucao静的に割り当てられるため、ループ内で再割り当てする必要はありません。

于 2009-06-21T14:39:18.777 に答える
0

コードの意図はわかりませんが、次のことを行うことは確かに違法です。

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

基本的に、包含構造は malloc を使用して割り当てられましたが、問題の内部メンバーは静的に定義された配列であり、ヒープを使用して再配置することはできません (ヒープ マネージャーはノードへの malloced ポインターのみを追跡するため)。

typedef struct node{ char rotulo[10]、instrucao[1][2][10]、フラグ;

命令のサイズを動的に変更する場合は、ポインタ型として定義し、メモリを個別に割り当てる必要があります。

于 2009-06-21T14:47:04.380 に答える