Cで構造体の中に文字を設定する方法は?
-
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-&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 のサイズを動的に変更する場合は、ポインタタイプとして定義し、メモリを個別に割り当てる必要があります。