Probleme mit Call-by-Reference
-
Hy,
erstmal der Code:#include<stdlib.h> void fillarray(int* a) { int i=0; a = (int*) realloc(a, (i+1)*sizeof(int) ); for(;i<3;i++){ a[i]=i; } return; } int main(int argc, char** argv) { int* a=NULL; fillarray(a); int i=0; for(;i<3;i++) printf("%d\n",a[i]); }
Wenn fillarray aufgerufen wird, dann wird ein Array erstellt, aber nach der Rueckkehr der Funktion wird a wieder auf NULL gesetzt, so das beim printf Aufruf ein Segmentation Fehler auftritt. Meine Frage: Wie kriege ich es hin, das nach dem Aufruf a den Array von fillarray() beibehaelt und das ganze per Call-by-Reference?
-
Es gibt in C kein Call-by-reference. Die übergebenen Parameter sind immer nur Kopien, was erklärt warum a nach fillarray(a) immernoch NULL ist.
Was du machen könntest ist zum einen:
// Prototyp void fillarray(int **); // Aufruf fillarray(&a); // Adresse von a übergeben
oder die imho schönere Variante:
// Prototyp int *fillarray(void); // Aufruf a = fillarray();
Bei beiden Varianten muss man logischerweise noch die Funktion entsprechend anpassen
Edit: Achja, es ist absolut nicht nötig realloc() zu casten.
-
a = (int*) realloc(a, (i+1)*sizeof(int) );
wenn du schon 3 Werte speichern willst, solltest du auch Speicher für 3 Werte bereitstellen, nicht nur für einen.
-
@feigling: Ach jo, hat ich aus versehen nicht mehr richtig hier eingefuegt.
@TactX: Mit Call-by-Reference meinte ich den 1. Vorschlag von dir.
Vielen Dank, das Problem ist geloest
-
hi leute!
frage noch zu diesem beispiel:void foo(int **value) { *value = new int[3]; **value++ = 1; } int main() { int *a = 0; foo(&a); cout << *a << endl; delete a; cin.get(); return 0; }
wenn ich verwenden würde: foo(a); was übergebe ich hier? einen pointer? sollte man in der funktion: foo für das **value++ = 1; klammern verwenden?
cu
-
warum bekomme ich hier einen runtime error?
void foo(int **value) { *value = new int[3]; **value = 1; *value++; **value = 2; }
-
weil du den block nur mit delete (*value-1) killen kannst.
vorsicht ist geboten beim hantieren mit atomwaffen und source code.
-
warum redest du jetzt von delete, das problem liegt ja hier:
void foo(int **value) { *value = new int[3]; **value = 1; *value++; **value = 2; }
-
Evtl. ist dein Aufruf falsch? Sicher falsch ist die Zeile
*value++;
Google mal nach "c operator precedence".
-
wah, mehr klammern, weniger regeln!
-
Ich bezweifle aber, dass das den Crash verursacht. Wäre ja fast schon pingelig, nur weil der Pointer 1 weiter zeigt. Will ich echt nicht glauben.
-
wenn alles falsch ist wie sieht es dann richtig aus?
-
problem gelöst;) aber wie gebe ich den speicher wieder frei? das delete in der main geht nicht;/ -> runtime error
void foo(int **value) { *value = new int[3]; **value = 1; ++(*value); **value = 2; } int main() { int *a = 0; foo(&a); --(*a); cout << *a << endl; delete[] a; return 0; }
-
++(*value);
**value = 2;ersetze das durch
*(value[1])=2;oder
*(*value+1)=2;denn durch das ++ zeigt der zeiger nachher ja nicht mehr auf den speicher der von new geholt wurde, sondern sizeof(int) bytes weiter.
-
so:
void foo(int **value) { *value = new int[3]; **value = 1; *(value[1]) = 2; <-- runtime error;/ }
-
void foo(int **value) { *value = new int[3]; **value = 1; *(*value+1) = 2; } int main() { int *a = 0; foo(&a); ++a; cout << *a << endl; delete[] a; cin.get(); return 0; }
warum geht hier das delete nicht? ;/
-
s geht nicht, weil ich dumm bin
*(value[1]) = 2;
muss
(*value)[1] = 2;sein
-
warum geht das delete[] a; im oberen codesnipsel nicht?
-
weil a nicht an den anfang eines speicherstuecks zeigt, sondern wo anders hin.
-
ach so;)
wie funktioniert das hier? (*value)[1] = 2; dann müsste doch auch folgendes gehen?value[0][0] = 2;