2017-07-17 12 views
1

Ich muss ein Array mit einem malloc zuweisen und ich muss einige Zahlen aus der Eingabe lesen. Dies ist mein Code:Pointer to Pointer Array & Stack Smashing Fehler

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

void read(int **array, int *array_size) 
{ 
    int *tmp; 
    int i; 
    scanf("%d", array_size); 
    *array=malloc(*array_size*sizeof(int)); 
    tmp=malloc(*array_size*sizeof(int)); 
    for(i=0;i<*array_size;i++) 
    { 
     scanf("%d", &tmp[i]); 
     array[i]=&tmp[i]; 
    } 
} 

//DO NOT EDIT main() 
int main() 
{ 
    int *array; 
    int array_size,i; 

    read(&array,&array_size); 

    printf("Print array:\n"); 
    for(i=0;i<array_size;i++) 
     printf("%d\n", array[i]); 

    return 0; 
} 

Es funktioniert irgendwie, aber nach Anzeige von Werten zeigt es ein Stapel (ich es mit GCC kompiliert) erkannt Zerschlagung.

Ich dachte, das Problem ist, dass *array=malloc(*array_size*sizeof(int)), aber ich kann nicht herausfinden, wie es zu beheben ist. Gibt es eine andere Möglichkeit, dieses Array zuzuordnen, ohne main() zu bearbeiten? Vielen Dank.

+0

Array_size ist nicht einmal initialisiert ... –

+2

BTW die '# include's sind absolut notwendig für MCVE. In Abwesenheit von '' 'malloc' wird sich schlecht auf 64-Bit-Plattformen schlecht benehmen. –

+0

@TonyTannous unter Berücksichtigung scanf Erfolg ..... es ist OK. –

Antwort

4

Das Problem ist, dass Sie das falsche Array indizieren. Sie sollten (*array)[i] schreiben, nicht array[i]:

void read(int **array, int *array_size) 
{ 
    int *tmp; 
    int i; 
    scanf("%d", array_size); 
    *array=malloc(*array_size*sizeof(int)); 
    tmp=malloc(*array_size*sizeof(int)); 
    for(i=0;i<*array_size;i++) 
    { 
     scanf("%d", &tmp[i]); 
     (*array)[i]=tmp[i]; 
    } 
} 

Natürlich alles sehr kompliziert ist - Sie brauchen nicht wirklich zu haben, dass tmp, noch müssen Sie auf malloc es brauchen. Stattdessen könnte man sehr gut tun so etwas wie

void read(int **array, int *array_size) { 
    int i, *pos; 
    scanf("%d", array_size); 
    *array = pos = malloc(*array_size * sizeof(int)); 
    for (i = 0; i < *array_size; i ++, pos ++) { 
     scanf("%d", pos); 
    } 
} 

, dass wir den Zeiger ist pos auf die aktuelle Position in der Anordnung zu zeigen, wo wir die nächste ganze Zahl scanf wollen. Auf jeder Schleife erhöhen wir die Position.

Natürlich möchten Sie die Rückgabewerte dieser scanf s und malloc überprüfen; und vielleicht sollte read haben einen anderen Prototypen, wie

int *read(int *array_size); 

so könnte sie den Zeiger auf das Array direkt zurück oder NULL auf Fehler.