Wie ein Zeichen innerhalb einer Struktur in C setzen?
-
06-07-2019 - |
Frage
Wie kann ich Speicher zuweisen für einen char-Variable (keine char Zeiger) innerhalb einer Struktur?
(Variablennamen sind auf portugiesisch, sorry, wenn es ein bisschen verwirrend ist)
Ich habe diese Struktur:
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;
Das ist Funktion insere()
die abgelesenen Werte aus einer Eingabedatei in einem neuen Knoten setzt:
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]);
}
}
Dieses NovoEstado->flag = flag;
nicht funktioniert ...
Gleich nachdem ich es gesetzt, wenn ich NovoEstado->flag
drucken bekomme ich den richtigen Wert, aber wenn ich es nach diesem for
durch das Ende der Funktion setzen, wenn ich NovoEstado->flag
drucken bekomme ich das erste Zeichen von NovoEstado-> Rótulo ...
Das gleiche passiert, wenn ich versuche, flag
in main()
zu drucken ...
Ich stelle dar, das ist, weil ich nicht richtig bin Zuweisung von Speicherplatz in flag
Insere()
, ist das richtig? Und wie kann ich es beheben?
Ich bin mir ziemlich sicher, dass es eine schreckliche einfache Frage, und dass ich possibily dies einmal wusste, aber ich habe vergessen, und kann es nicht überall ... So jede mögliche Hilfe sehr geschätzt werden würde
Bearbeiten
Nach ocdecio Tipp habe ich einen Zeiger auf ein zweidimensionales Feld, um eine dinamic 3-dimensionale Array zu haben.
Mein Ziel ist es, eine „Tabelle“ wie diese haben:
10 chars | 10 chars
|__________|__________|
|__________|__________|
|__________|__________|
Wenn die Anzahl der Zeilen ist dinamic, aber es ist immer ein Array von 2 Strings von 10 Zeichen.
So, jetzt das ist, was ich in Haupt tun:
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);
Aber das funktioniert nicht ...
Dies ist die Eingabe aus einer Datei lesen
adsasdfg2: (abc,123) (def,456) (ghi,789);
aber noch bevor ich rufe Insere
ich nicht die richtigen Werte zuweisen den Weg instrucao
Ich möchte, da dies der Ausgang dieses printf
ist
123
454
789
statt dem, was ich bin mit dem Ziel für
123
456
789
Was ist los?
(bevor jemand fragt, ist dies Teil eine Hausaufgabe, aber nicht die Hausaufgaben. Meine Aufgabe ist es, eine deterministische Finite Automata minimizer zu machen, ist dies nur ein Bug ich bin immer im Zusammenhang mit Dateneingabe)
Durch eine ganze Menge
Lösung
Ihr Problem ist wahrscheinlich in dieser Linie sein:
realloc(NovoEstado->instrucao, i+1*sizeof(char[2][10]));
Es gibt keine Notwendigkeit, etwas in Ihrer Struktur zuzuordnen, da das Feld instrucao
statisch durch die Anweisung instrucao[1][2][10]
definiert ist, es ist nicht eine dynamisch zugewiesenen Struktur.
Andere Tipps
Ich denke, diese Linie ist das Problem:
realloc(NovoEstado->instrucao, i+1*sizeof(char[2][10]));
In der Struktur der Instrução als Batzen kontinuierlichen Speicher definiert ist, aber Sie sind jetzt einen Speicher und Zuordnen der Zeiger zugewiesen wird.
Versuchen Sie es zu kommentieren, müssen Sie nicht Speicher zuweisen für diese Variable.
Sie müssen keine Flagge zuzuweisen. Es ist ein Zeichen innerhalb der Struktur definiert (im Gegensatz zu einem Zeiger entgegenstellen).
Ihr Fehler wird durch Überschreiben Flag des Inhalts innerhalb der Struktur während der for-Schleife verursacht, wo Sie schreiben, um NovoEstado->instrucao
(das heißt es ist ein Speicher kritzelt oder überschreiben).
Update:. Als @ocdecio weist darauf hin, Sie müssen nicht in der Schleife realloc, wie instrucao
auch statisch zugeordnet ist
Ich weiß nicht die Absicht des Codes, aber es ist sicherlich illegal Folgendes zu tun:
realloc (NovoEstado-> Instrução, i + 1 * sizeof (char [2] [10]));
Grundsätzlich wurde die Aufnahmestruktur zugeordnet malloc, aber die Innen betreffende Mitglied ist eine statisch definierte Anordnung, und es kann nicht rellocated werden, um den Haufen verwendet (da der Heap-Manager verfolgt nur den malloced Zeiger zu Knoten).
typedef struct {char Knoten Rótulo [10], Instrução [1] [2] [10], Flag;
Wenn Sie möchten, für um die Größe Instrução dynamisch, können Sie es als Zeigertyp definieren müssen und Speicher zuweisen für sie separat.