2016-04-23 15 views
0

Wenn ich diesen Code ausführen wird mir "Segmentation Fault" gezeigt, aber wenn in der "für" der "create" -Funktion ich die Klausel setzen i < 1 (dh einen Zyklus), die Programm funktioniert, warum?Segmentierungsfehler bei Realloc ANSI C

void create(char ***a,int *length){ 
    int i=0; 
    *length = 0; 
    for(i=0;i<4;i++){ 
     ++(*length); 
     (*a)=realloc(*a,(*length)*sizeof(char *)); 
     *(a[i])="Hello\0"; 
    } 
} 

int main(int argc, char *argv[]) { 
    int i; 
    char **a = NULL; 
    int *l = malloc(sizeof(int)); 
    create(&a,l); 
    for (i=0; i<(*l); i++) { 
     printf("%s",a[i]); 
    } 
    printf("\n"); 
    return EXIT_SUCCESS; 
} 

was würde Ich mag ist, dass das Programm zeigt mir 4 mal "Hallo" am Ende,

+2

Warum ordnen Sie Speicher für "l" dynamisch zu, anstatt es nur als normale Nicht-Zeigervariable zu deklarieren und mit dem Address-of-Operator zu übergeben? Es gibt noch ein paar andere Dinge, die merkwürdig oder einfach falsch erscheinen: In der Kategorie "odd" wird der explizite String-Terminator in der Konstanten-Zeichenfolge verwendet, die nicht benötigt wird, und im "falschen" Teil dem Zeiger neu zugewiesen Sie werden neu zugewiesen (denken Sie daran, was passiert, wenn 'realloc 'fehlschlägt). –

+1

Versuchen Sie auch zu vermeiden, ein [Drei-Sterne-Programmierer] (http://c2.com/cgi/wiki?ThreeStarProgrammer) zu sein, es ist normalerweise kein Kompliment. –

+1

@JoachimPileborg: Wie würden Sie dann diesen Anwendungsfall über ein Funktionsargument behandeln, wenn nicht über 'T ***'? – alk

Antwort

4

Diese

*(a[i]) = ... 

sollte

(*a)[i] = ... 

sein Ein "String" Literal wie "Hello" bereits implizit fügt ein abschließendes '\0' Zeichen hinzu. Es ist also nicht notwendig, es zu spezifizieren explizit wie hier: "Hello\0".