2016-05-15 14 views
1

Im Folgenden Code ist nur ein Beispiel, das ich später auf den Punkt zu kommen, verwenden:Formal malloc zu verwenden realloc später

/* Extract digits from an integer and store in an array in reverse order*/ 

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

int main(void) 
{ 
    int oct=316; 
    int* array=malloc(0*sizeof(int*)); //Step 1 
    int* temp; 
    size_t size=0; 
    while(oct/10>0 || oct%10>0){ 
     temp=realloc(array,++size*sizeof(int)); // Step2 requires Step1 
     if(temp==NULL){ 
      printf("Can't reallocate memory"); 
      exit(-1); 
     } 
     else{ 
      array=temp; 
     } 

     array[size-1]=oct%10; 
     oct/=10; 
    } 
    for(int i=0;i<size;i++) 
    printf("%d\n",array[i]); 

    return 0; 
} 

Die realloc Referenz [1] Zustände:

ordnet den angegebenen Bereich des Speichers . Es muss vorher von malloc(), calloc() zugeordnet werden, realloc() ...


Zunächst ich den Code ohne Schritt 1 erstellt und es auf Lauf ich einen Segmentation Fault bekam. Dann habe ich Schritt1 eingefügt, jetzt kompiliert der Code gut. Ich möchte keinen Platz reservieren, ohne eine Ganzzahl zum Speichern zu finden, daher habe ich eine Größe von null mit malloc verwendet. malloc verweist jedoch [2] Staaten:

Wenn Größe Null ist, hängt der Rückgabewert von der jeweiligen Bibliothek Implementierung (es kann oder auch nicht ein Nullzeiger), aber die zurück Zeiger werden nicht dereferenziert werden.

Jetzt bezweifle ich, dass meine Implementierung portabel ist. Wie kann ich dieses Problem umgehen?

Ich habe versucht, int* array=NULL;, aber ich habe eine Segmentierung Fehler.

+0

'realloc (array, ++ size);' -> 'array = realloc (array, ++ Größe * sizeof (int)); ' – BLUEPIXY

+0

Beachten Sie, dass Sie nicht schreiben sollten:' ptr = realloc (ptr, new_size); 'Zuweisung an die Variable, die Sie verwenden, um den Zeiger auf das Leerzeichen zu halten. Wenn das 'realloc()' fehlschlägt, verlieren Sie Speicher, weil Sie den Zeiger mit NULL überschrieben haben. Sie müssen eine Variante von: 'void * data = realloc (ptr, new_size); if (data == NULL) {... mit Fehler umgehen ...} ptr = data; '. –

+0

Die Verwendung von 'malloc (0)', um den Zeiger zu initialisieren, funktioniert, aber es ist ein wenig verschwenderisch. Setzen Sie es einfach auf NULL. –

Antwort

6

Sie können array auf NULL initiieren. In der Manpage realloc(void *ptr, size_t size) können Sie lesen:

Wenn ptr NULL ist, dann ist der Anruf entspricht malloc (Größe)

Außerdem realloc nicht seine Parameter nicht ändert. Es gibt den Zeiger auf neu zugewiesenen/neu zugewiesenen Speicherplatz zurück. Also, für eine Umschichtung Sie tragen einen Code wie verwenden:

array = realloc(array,(++size)*sizeof(int)); 
if (array == NULL) { some error; } 
+2

Der Vollständigkeit halber: C11 (Entwurf) 7.22.3.5/3 (http://port70.net/~nsz/c/c11/n1570.html#7.22.3.5p3) – alk