2017-03-25 2 views
0
'    int main() 
       { 
        int *ptr = (int*)calloc(10,sizeof(int));//allocating memory for 10 integers 
        ptr = realloc(ptr,20*sizeof(int)); //reallocating the memory for 20 integers 
        free(ptr); 
        return 0; 
      }' 

Anfänglich enthält der PTR-Speicher Nullen, aber der neu erstellte Speicher enthält Nullen oder Garbage-Werte.Was wird das Ergebnis sein, wenn ich den Calloc-Zeiger neu zuweisen?

Wenn Nullen darstellen, wie kann wissen, realloc das ptr Wetter wird mit malloc oder calloc erstellt.

+0

Der Code ist nicht korrekt. Lesen Sie die man-Seite von 'realloc' (die auch Ihre Frage beantworten wird). Es wird von Ihnen erwartet, dass Sie zumindest einige Anstrengungen unternehmen. – Olaf

+0

oh jetzt das ist es richtig. Zeit, meine Antwort zu aktualisieren :) –

+0

Ich muss sagen, ich finde das schwer zu folgen. Aber da OP tatsächlich die Tippfehler verbessert, mache ich es gerne. –

Antwort

3

Auch wenn Sie realloc gleichen Einschränkungen unterworfen wie (ohne Gießen das Ergebnis und es zurück zuweisen oder es funktioniert nicht richtig) genannt:

ptr = realloc(ptr,20*sizeof(int)); 

(und manche sagen, dass es nicht sicher ist, wie realloc kann NULL

zurückgeben, so dass es den ref zu ptr

10 es nicht verliert. Es ordnet nur ohne Einstellung der Rest 0

Sie haben den Rest des Speichers auf 0 manuell zum Beispiel unter Verwendung von memset einzustellen.

ich tun würde:

int *ptr_new = realloc(ptr,20*sizeof(int)); 
if (ptr_new == NULL) { /* print error, free(ptr) and exit: no more memory */ } 
else 
{ 
    // set the end of memory to 0 
    memset(ptr_new+10,0,sizeof(int)*10); 
    ... 

Hinweis: Ein häufiger Fehler ist nicht das Ergebnis realloc Zuordnung zurück, da es scheint zu funktionieren, bis zu dem Punkt, wo das Betriebssystem der Speicher zu einem anderen bewegen muss blockieren, in diesem Fall wird Ihr ptr Zeiger ungültig und Sie haben undefiniertes Verhalten.

+0

Wird 'realloc' nicht die Daten kopieren, die vorher am Zeiger waren (so viel wie passt, das ist)? In diesem Fall würden die 0s bestehen bleiben, höchstens genauso viel wie vorher. –

+1

aber wenn wir einige Daten in unserem PTR enthalten, und es dann neu zuweisen, kopiert das Realloc die Daten an dem neuen Ort, habe ich recht ?? –

+1

ja, sie würden beibehalten, aber nicht über die zuvor zugewiesene Speichergröße. –

Verwandte Themen