質問

構造体内の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-&gt; flag = flag; は機能していません...
設定した直後に、 NovoEstado-&gt; flag を印刷すると正しい値が得られますが、関数の終わりまでに for の後に置くと、 NovoEstado-&gt; flag を印刷します。NovoEstado-&gt; rotulo ...
の最初の文字を取得します。 main() ...

flag を印刷しようとすると同じことが起こります。

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

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

編集

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 を呼び出す前でさえ、正しい値を 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]));

構造では、インストラクションは連続メモリのチャンクとして定義されていますが、メモリを割り当ててポインタを割り当てています。

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

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

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

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

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

realloc(NovoEstado-&gt; instrucao、i + 1 * sizeof(char [2] [10]));

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top