2017-02-05 6 views
0

So habe ich eine Struktur "Sequenz", die ein char * drin hat. Wenn ich versuche, eine Sequenz zu erstellen, segne ich jedes Mal, wenn ich versuche, das Zeichen zu ändern. Hier ist der zugehörige Code. Die Struktur:Segfault beim Zuweisen zu char * in Struktur

typedef struct _sequence { 
    unsigned int length; 
    unsigned char* bytes; 
} Sequence; 

Der Konstruktor:

Sequence* newSequence(unsigned char firstByte) {  //Creates new sequence, allocates memory 
    printf("Creating new Sequence\n"); 
    Sequence* seq = (Sequence*)malloc(sizeof(Sequence)); 
    printf("Have new sequence\n"); 
    seq->length = 1; 
    printf("Set length\n"); 
    seq->bytes[0] = firstByte; 
    printf("Set variables\n"); 
    return seq; 
} 

Jetzt habe ich eine Hauptfunktion hier nur zu Testzwecken, diese Datei am Ende nicht eine Hauptfunktion hat. Aber hier ist was ich zum Testen verwendet:

int main() { 
    char test[] = "ab"; 
    printf("Testing sequences!\n"); 
    Sequence* newSeq = newSequence(test[0]); 
    printf("Made new sequence!\n"); 
    outputSequence(newSeq, stdout); 
    printf(" <-- new Sequence created\n"); 
    return 0; 
} 

Die printfs sind wieder zu Testzwecken. Es druckt immer den ganzen Weg bis zu "Set length \ n" im Konstruktor, dann segfaults. Was mache ich falsch? Vielen Dank!

Antwort

2
Sequence* seq = malloc (sizeof(Sequence)); 

Hier weisen Sie Speicherplatz für ein char * und ein int, aber Sie müssen Speicherplatz zuweisen für das, was Sie wollen speichern, was auf dem von Ihrem char * gerichtet ist, auf diese Weise:

seq->bytes = malloc (my_string_size); 

Nur dann können Sie beginnen, Zeichen in Ihrem zugewiesenen Stück Speicher zu speichern.

Edit: zum Beispiel ein einzelnes Zeichen zu speichern, könnten Sie tun:

seq->bytes = malloc(1); 
seq->bytes[0] = firstByte; 

es als ein einzelnes Zeichen zu verwenden. Aber die gute Gewohnheit in C-String zu manipulieren, ist immer ein Zeichen zu verlassen mehr, in dieser Art und Weise:

seq->bytes = malloc(2); 
seq->bytes[0] = firstByte; 
seq->bytes[1] = '\0'; 

Die zweite Methode sieht eher aus wie ein echt ‚string‘ in C.

+0

Dies ist in der Linie von dem, was ich dachte, war falsch, aber war sich nicht sicher. Danke, dass du es so gut erklärt hast. Ich werde die Antwort abfragen, sobald die Mindestzeit verstrichen ist. –

3

Sie haben die Struktur korrekt zugeordnet, aber Sie haben dem Puffer, auf den das Element bytes verweist, keinen Speicherplatz zugewiesen.

Diese Zeile ruft nicht definiertes Verhalten, weil bytes nicht initialisiert ist:

seq->bytes[0] = firstByte; 

Sie müssen auch einen Puffer und Punkt seq->bytes hierfür zur Verfügung stellen.

+0

oder definieren SEQ-> Bytes als eine feste Länge Array von char – Aubin

Verwandte Themen