2016-07-03 17 views
2

Ich poste diesen Beispielcode, um mein Problem zu erklären. Ich versuche, zwischen Funktionen einen Zeiger auf Integer zu übergeben. Wenn Sie den Code & kompilieren, werden Sie sehen, dass seltsame Zahlen erscheinen und ich kann nicht warum. Ich denke, es ist eine schlechte Verwendung von . Wenn jemand einen Hinweis geben könnte oder mich auf einige ähnliche Fragen umleiten könnte, würde ich mich freuen. Ich suche nach diesem Problem, aber ich kann nichts ähnliches finden.Zeiger auf Zeiger übergeben und Speicherplatz neu zuweisen

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


void myFunction(int **output); 


int main(){ 

    int *indices; 
    myFunction(&indices); 

    printf("{"); 
    for(int i=0;i<10;i++){//suppose also for some mysterious reasons that I know min_size in the main 
     printf("%i,", indices[i]); 
    } 
    printf("}\n"); 

    return 0; 
} 


void myFunction(int **output){ 

    int size = 130;//allocating big amount of space 
    int* indices = malloc(sizeof(int)*size); 

    //...start doing mysterious stuffs.... 
    int min_size = 10; 
    for(int i=0;i<min_size;i++){ 
     indices[i] = i;//just for saving something 
    } 
    //...end doing mysterious stuffs... 

    //now for some reasons I know I need only min_size elements and all other are wasting space so I reallocate 
    indices = realloc(indices,min_size);//resizing in order to save space 

    *output = indices; 
} 
+0

Sie auf den Zeiger Sie 'realloc' passieren nicht neu zuweisen zurück, Denken Sie darüber nach, ob 'realloc' fehlschlägt und' NULL' zurückgibt, dann werden Sie den ursprünglichen Zeiger verlieren und ein Speicherleck haben. –

+1

Für Ihr Problem, 'Realloc' genau wie' Malloc' nimmt seine Größe *** in Bytes ***. Zehn Bytes unterscheiden sich stark von zehn int-Elementen. –

+0

Sie ordnen 'malloc sizeof (int) * size' zu, aber reallocating:' realloc (Indizes, min_size'. Ich denke, es sollte 'realloc sein (Indizes, min_size * sizeof (int))' –

Antwort

2

Sie verwenden Realloc falsch. Die Größe des verrechneter Ausmaß muss

min_size * sizeof(int) 

sein Hier sind Sie

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

void myFunction(int **output); 


int main(void) 
{ 

    int *indices; 
    myFunction(&indices); 

    printf("{"); 
    for(int i=0;i<10;i++){//suppose also for some mysterious reasons that I know min_size in the main 
     printf("%i,", indices[i]); 
    } 
    printf("}\n"); 

    return 0; 
} 


void myFunction(int **output){ 

    int size = 130;//allocating big amount of space 
    int* indices = malloc(sizeof(int)*size); 

    *output = indices; 
    // ^^^^^^^^^^^^^^^ 

    //...start doing mysterious stuffs.... 
    int min_size = 10; 
    for(int i=0;i<min_size;i++){ 
     indices[i] = i;//just for saving something 
    } 
    //...end doing mysterious stuffs... 

    //now for some reasons I know I need only min_size elements and all other are wasting space so I reallocate 

    indices = realloc(indices, min_size * sizeof(int));//resizing in order to save space 
    //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

    if (indices) *output = indices; 
    //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
} 

Die Programmausgabe ist

{0,1,2,3,4,5,6,7,8,9,}