2016-05-05 10 views
1

Ich möchte eine Struktur Zeichenfolge mit fester Länge definieren, wie folgt aus:Typdef-Array fester Länge -> automatisch erweiterte Größe?

typedef char str8[8]; 

so kann ich Arrays mit fester Länge Zeichenfolge wie erstellen:

str8 * mydata; 
mydata = malloc(100 * sizeof(str8)); 

ich mydata bin mit ein speichern Liste der Namen: Peter Waseels Grumpy Lexiunos Beta ...

Alles funktioniert gut bis mydata [3], die LexiunosBeta anstelle von Lexiunos wird. Mydata [4] ist jedoch immer noch nur Beta.

Dies scheint nur bei Größe (Name)> = Größe (Str8) auftreten. Ich erweitere str8 zu str10 als temporäre Lösung, aber ich möchte wirklich wissen, was das eigentliche Problem ist und wie ich es beheben könnte.

Wenn ich typedef char str8 [8] zu einer robusteren Definition wie: typedef {char * x;} str8; Wird es das Problem lösen?

Vielen Dank allen!

+0

Out-of-Range-Zugriff von Arrays wird * nicht definiertes Verhalten aufrufen *. – MikeCAT

Antwort

3

Lexiunos ist 9 Bytes zählen die nachlaufende NUL und Ihr typedef ist char[8], Sie schreiben außerhalb der Grenzen des Arrays.

Werfen Sie einen Blick auf this thread:

In diesem speziellen Fall Sie einen Stapel basierten Array deklarieren. Abhängig von der bestimmten Implementierung wird der Zugriff außerhalb der Grenzen des Arrays einfach auf einen anderen Teil des bereits zugewiesenen Stack-Speicherplatzes zugreifen (die meisten Betriebssysteme und Threads reservieren einen bestimmten Teil des Speichers für Stack).

Es gibt nichts, wie "Auto-Größe erweitern" für den Stapel, verwenden dynamischen Speicher:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(void) 
{ 
    char *arr[] = {"Peter", "Waseels", "Grumpy", "Lexiunos", "Beta", /*...*/}; 
    size_t size = sizeof arr/sizeof arr[0]; 
    char **mydata; 
    size_t i; 

    mydata = malloc(size * sizeof(*mydata)); 
    for (i = 0; i < size; i++) { 
     mydata[i] = malloc(strlen(arr[i]) + 1); 
     if (mydata[i] == NULL) { 
      perror("malloc"); 
      exit(EXIT_FAILURE); 
     } 
     strcpy(mydata[i], arr[i]); 
    } 
    for (i = 0; i < size; i++) { 
     printf("%s\n", mydata[i]); 
     free(mydata[i]); 
    } 
    free(mydata); 
    return 0; 
} 
+0

Vielen Dank für Ihre Klarstellung! Jetzt habe ich meinen Fehler gesehen! Müssen Sie die gute Codierungsgewohnheit lernen! – CrazyFrog

+0

Gern geschehen;) –