2016-07-05 3 views
0

Ich sah Code auf einigen Websites auf realloc() wie folgt.Ist es eine gute Programmierpraxis, die von realloc() zurückgegebene Adresse demselben Zeiger zuzuordnen?

int *p = (int *)malloc(sizeof(int) * 10); 
p = (int *)realloc(p, 100); 

Aber wie der Standard sagt, wenn realloc fehlschlägt, wird der ursprüngliche Block unberührt gelassen und es wird NULL zurückgegeben.

Also, wenn Realloc fehlschlägt, von oben Beispiel, verlieren wir die Fähigkeit, p zu befreien. Kann jemand bitte lassen Sie mich wissen, ist es gute Programmierpraxis, die Adresse von Realloc() auf den gleichen Zeiger zugewiesen?

+1

Unrealed, solange Sie sich mit dem Thema "gute Programmierpraxis" beschäftigen, lesen Sie vielleicht folgendes: [Werde ich das Ergebnis von 'malloc' übertragen?] (Https://stackoverflow.com/questions/605845/ do-i-cast-das-Ergebnis-von-malloc). – WhozCraig

+0

* Kann jemand bitte lassen Sie mich wissen, ist es gute Programmierpraxis, um die Adresse von Realloc() auf den gleichen Zeiger? * Direkt nach * Also wenn Realloc fehlschlägt, von oben Beispiel, verlieren wir die Fähigkeit zu befreien p. *? Was denken Sie? –

+1

Wer hat abgestimmt, um zu schließen, wie ist das "in erster Linie auf der Grundlage von Meinungen"? Die Praxis OP gefragt ist ** immer ein Bug **. –

Antwort

5

Sie haben Recht, dass die direkte Zuweisung des Rückgabewerts realloc an Ihre einzige Kopie des ursprünglichen Zeigers eine schlechte Übung ist. Sie verlieren nicht nur die Fähigkeit free den Speicher, wenn realloc fehlgeschlagen (ich würde dies das kleinere Problem nennen); Sie auch verlieren Sie die Daten, auf die Ihr Zeiger zeigte.

Für einige Programme ist dies egal (zB wenn Sie nur die gesamte Operation bei Zuteilungsfehlern abbrechen und abbrechen, was eine akzeptable Praxis sein kann oder nicht und das ein ganzes Thema ist), aber in Im Allgemeinen müssen Sie zuerst das Ergebnis von realloc in einer separaten temporären Variablen speichern und die ursprüngliche Zeigervariable nur überschreiben, nachdem Sie überprüft haben, dass es erfolgreich war.

2

R. gab eine klare Antwort auf Ihre Frage. Lassen Sie mich im Codefragment zwei andere Fragen betonen:

int *p = (int *)malloc(sizeof(int) * 10); 
p = (int *)realloc(p, 100); 

Es ist vor allem eine schlechte Praxis in C als den Rückgabewert von malloc(), calloc() und realloc() zu werfen. Der void * Rückgabewert wird automatisch an den entsprechenden Zeigertyp umgewandelt werden, es sei denn, der Code als C++ Code kompiliert wird, die eine entfremdete Cousin von C. ist

Noch wichtiger ist, macht es keinen Sinn zu realloc den Zeiger auf eine hartkodierte machen Größe 100. Die Anzahl der int s, auf die im neu zugewiesenen Array zugegriffen werden kann, hängt von der tatsächlichen Größe des Typs int ab, der von System zu System variieren kann. Bei einigen Architekturen ist 100 nicht einmal ein Vielfaches von sizeof(int). Der Autor hätte vielleicht schreiben wollen p = realloc(p, sizeof(int) * 100); oder p = realloc(p, sizeof(*p) * 100);, und mehr Kontext um das Fragment könnte helfen, die Absicht zu verstehen ... Wie geschrieben, ist es sehr wahrscheinlich ein Fehler, aus mehreren Gründen.

+0

Danke. Ich habe nur eines der Beispiele auf den Internetseiten kopiert. Aber ich habe den Punkt verstanden. – kadina

Verwandte Themen