problem mit pointer in C
-
hallo,
ich hab eine funktion, die als argument zwei arrays übernimmt, beide addiert und in einem dritten array die summen speichert und dann einen pointer auf das dritte array zurück gibt.
wenn ich die funktion jetzt so aufrufe:printf("%d\n", array_total(array1, array2));
wird mir der erste wert des dritten arrays richtig angezeigt.
wie kann ich jetzt aber auf die anderen werte zugreifen?printf("%d\n", (array_total(array1, array2)++); liefert einen fehler
ich hab auch schon versucht dem zurückgegeben pointer in einen anderen zu kopieren, aber das geht auch irgendwie nicht:
int *a = array_total(array1, array2);
ich hoffe, ich hab mich halbwegs verständlich ausgedrückt.
-
Du musst die Werte in einer Schleife ausgeben. Wenns nicht zu viele sind, dann könntest du es so machen.
// Nur 3 Ergebnisse int *ergebnis = f(...); printf ("%d %d %d\n", ergbnis[0], ergbnis[1], ergebnis[2]);
-
alvaraalto schrieb:
hallo,
ich hab eine funktion, die als argument zwei arrays übernimmt, beide addiert und in einem dritten array die summen speichert und dann einen pointer auf das dritte array zurück gibt.
wenn ich die funktion jetzt so aufrufe:printf("%d\n", array_total(array1, array2));
wird mir der erste wert des dritten arrays richtig angezeigt.
wie kann ich jetzt aber auf die anderen werte zugreifen?printf("%d\n", (array_total(array1, array2)++); liefert einen fehler
ich hab auch schon versucht dem zurückgegeben pointer in einen anderen zu kopieren, aber das geht auch irgendwie nicht:
int *a = array_total(array1, array2);
ich hoffe, ich hab mich halbwegs verständlich ausgedrückt.
Wenn ich richtig verstanden habe, befindet sich das dritte Array innerhalb der Funktion und Du gibst einen Zeiger
drauf als Rückgabewert der Funktion zurück.Das Array innerhalb der Funktion muss "static" deklariert sein! z. B.: static int array[100];
-
danke erstmal für die schnellen antworten.
also ich hab's jetzt als static deklariert, aber irgendwie will es immer noch nicht funktionieren.
ich hab einen neuen pointer deklariert und will den rückgabewert der funktion dort hinein kopieren:
[cpp] int *ergebnis = array_total(array1, array2); [/cpp]
beim kompilieren kommt dann aber immer die warnung: Zuweisung erzeugt Zeiger von Ganzzahl ohne Typkonvertierung
-
Hi!
Also, meiner Meinung nach gibt es 2 Möglichkeiten das Probelm zu lösen, wobei mir das mit static nicht so gut gefällt.
1. Möglichkeit:
Du übergibst ein drittes Array an dir Funktion, in die du das Ergebnis rein schreibst:
void array_total(int *array1, int *array2, int *erg);
2. Möglichkeit
Du erstellst in der Funktion mit malloc ein Array und gibst das zurück. Dann must du dich aber um das Löschen des allozierten Speichers kümmern.
int* array_total(int *array1, int *array2) { int * erg = malloc(sizeof(int) * (<länge array1> + <länge array2>)); // Die länge der arrays muss bekannt sein, oder du gibst sie zusätzlich als Parameter mit. //tu was return erg; }
mfg bauerb
-
besten dank!!! das mit dem malloc hat geklappt
kurze frage noch...geb ich den speicher dann noch in der funktion wieder frei? müsste ich ja eigm, oder?!
-
alvaraalto schrieb:
besten dank!!! das mit dem malloc hat geklappt
kurze frage noch...geb ich den speicher dann noch in der funktion wieder frei? müsste ich ja eigm, oder?!
nein, nach dem du das ergebnis verarbeitet hast und nicht mehr brauchst. das ist der nachteil bei solchen funktionen. daher plädiere ich für bauerb's 1. variante
-
Hi!
Wenn du den Speicher in der Funktion frei gibst, dann greifst du auf einen nicht gültigen Speicherbereich zu. Das KANN gut geh, das KANN aber auch zu einen SegFault führen.
int* irgendwas(int *array1, int length1, int *array2, int length2) { int *erg = malloc(sizeof(int)*(length1+length2)) //tu was // free(erg); -> DAS führt zu einem Fehler. return erg; } int main() { int array1[5]={1,2,3,4,5}; int array2[5]={1,2,3,4,5}; int *erg = NULL; erg=irgendwas(array1, 5, array2, 5); // tu was mit erg free(erg); return 0; }
mfg bauerb
-
also das programm sieht jetzt folgenermaßen aus:
[cpp] #include <stdio.h> #include <malloc.h> #define SIZE 5 int* array_total(int *x, int length_x, int *y, int length_y); int main() { int array1[5] = {0, 1, 2, 3, 4}; int array2[5] = {5, 6, 7, 8, 9}; int i, *z = NULL; z = array_total(array1, 5, array2, 5); for(i = 0; i < SIZE; i++) { printf("%d\n", *z); *(++z); } free(z); return 0; } int* array_total(int *x, int length_x, int *y, int length_y) { int *z = malloc(sizeof(int) * (length_x + length_y)); int i; for(i = 0; i < SIZE; i++) z[i] = x[i] + y[i]; return z; } [/cpp]
lässt sich auch kompilieren und ausführen...es werden mir auch die richtigen summen angezeigt. jedoch erscheint am ende auch ein "Speicherzugriffsfehler".
wenn ich das "free(z)" jedoch auskommentiere, läuft es ohne fehler.
-
Hi!
#include <stdio.h> #include <malloc.h> #define SIZE 5 int* array_total(int *x, int length_x, int *y, int length_y); int main() { int array1[5] = {0, 1, 2, 3, 4}; int array2[5] = {5, 6, 7, 8, 9}; int i, *z = NULL; z = array_total(array1, 5, array2, 5); for(i = 0; i < SIZE; i++) { printf("%d\n", *z); *(++z); // DA IST DEIN FEHLER } free(z); return 0; }
Du darfst Z nicht verändern:
entweder du machstint *temp=z; for(i = 0; i < SIZE; i++) { printf("%d\n", *temp); temp++; // Da brauchst du keinen Stern, da du die Adresse inkrementieren willst }
oder
for(i = 0; i < SIZE; i++) { printf("%d\n", z[i]); }
oder
for(i = 0; i < SIZE; i++) { printf("%d\n", *(z+i)); }
Diese 3 Methoden liefern alle das gleiche Ergebins. Du musst free den gleichen Pointer übergeben, den dir Malloc geliefert hat.
mfg bauerb
-
tausend dank...jetzt klappt alles