構造体内の 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 のヒントに従って、動的な 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
どうしたの?
(誰かが尋ねる前に、これは宿題の一部ですが、宿題ではありません。私の仕事は、決定論的有限オートマトン最小化ツールを作成することです。これは、データ入力に関連して発生する単なるバグです)
どうもありがとう