Zeiger-Probleme
-
Hallo Leute,
bräuchte mal wieder Euere Hilfe.
Habe leichte Verständnisprobleme mit folgendem C-Konstrukt:int funk1 (int **m); { .... scanf ("%d",&n); ... m = (int*) malloc (n*n*sizeof(int)); return n; } main() { int *m; ... n = funk1(&m); ... }
Ich generiere in meiner main-Funktion einen Zeiger m, den ich als Adressparameter an die Funktion funk1 übergebe.
- Wieso benötige ich dann für die Funktion einen Doppelzeiger?In der Funktion funk1 reserviere ich mir doch eine Speicherbereich. Kann ich von diesem Speicherbereich die Anfangsadresse an eine weitere Funktion funk2 übergeben? Und wenn ja, wie?
Oder wird diese Speicherreservierung nach Beendigung der Funktion wieder freigegeben?Hoffe Ihr könnt mir da weiterhelfen.
Danke im vorrausTace
-
Wieso benötige ich dann für die Funktion einen Doppelzeiger?
Weil C Call by Value nutzt, also der Parameter nur eine Kopie ist. Da du aber den Zeiger veränderst (und nicht das worauf der Zeiger zeigt) musst du einen Zeiger auf den Zeiger übergeben
Oder wird diese Speicherreservierung nach Beendigung der Funktion wieder freigegeben?
Nein! Den Speicher, den du mit malloc alloziert hast, musst du explizit mit free freigeben!
Kann ich von diesem Speicherbereich die Anfangsadresse an eine weitere Funktion funk2 übergeben? Und wenn ja, wie?
ganz normal
void funk2(int *ptr) { //... } int main(void) { int *p; funk1(&p); funk2(p); free(p); }
btw. sollte man den Rückgabewert von malloc nicht casten!
-
Hallo,
endlich habe ich es verstanden.
Besten Dank.
Tace
-
m = (int*) malloc (n*n*sizeof(int));
sollte wohl eher
*m = malloc (n*n*sizeof(int));
heissen
-
Hallo nochmal,
war wohl doch etwas zu schnell, mit meiner Antwort...
Mein Programm besteht momentan aus 2 Funktionen, die ich vorgegeben bekommen habe (func1 und func2). Es soll mit der einen Funktion eine nxn-Matrix eingelesen und mit der anderen ausgegeben werden.
Nur "schieß" ich mir mit den Zeigern und der Werteingabe den Speicher kaputt.
Hoffe Ihr könnt mir da nochmal helfen.
#include <stdio.h> #include <stdlib.h> unsigned *matrix = NULL; int n, i, j, dim; int func1(unsigned int **m); int func2(int *m, int dim); main() { n = func1(&matrix); func2(&matrix, dim); return 0; } int func1(unsigned int **m) { printf("Dimension: \n"); scanf("%d", &n); *m = calloc (n*n,sizeof(unsigned)); printf("Matrix-Eingabe: \n"); for (i = 0; i<n; i++) for(j=0; j<n; j++) scanf("%d", *(m+i*n+j)); return n; } int func2(int *m, int n) { printf("Ausgabe:"); for (i = 0; i<n; i++) for(j=0; j<n; j++) printf("%d ", m+i*n+j); return 0; }
-
Schau dir noch mal ganz genau an, was du da func2 übergibst...
-
sorry, dass war nur ein kleiner Schreibfehler.
Es muss natürlich heißen:func2(&matrix, n);
Es ist nur so, dass mir schon beim Einlesen der Matrix, sich das Proramm verabschiedet.
-
Hallo zusammen,
kann mir denn keiner bei meinem Problem helfen?
Wäre nett, wenn sich jemand mein Programm mal anschauen könnte.
Danke im vorraus
Tace
-
Ich habe mal Deinen Code überarbeitet.
int func1(unsigned int **m); void func2(unsigned int *m, int dim); int main(void) { unsigned int *matrix; int n = func1(&matrix); func2(matrix, n); return 0; } int func1(unsigned int **m) { int i, j, n; printf("Dimension: \n"); scanf("%d", &n); *m = malloc (n*n*sizeof(unsigned)); printf("Matrix-Eingabe: \n"); for (i=0; i<n; i++) for(j=0; j<n; j++) scanf("%d", &((*m)[i*n + j])); return n; } void func2(unsigned int *m, int n) { int i, j; printf("Ausgabe:\n"); for (i = 0; i<n; i++) { for(j=0; j<n; j++) printf("%d ", m[i*n + j]); putchar('\n'); } }
-
Original erstellt von mady:
**Ich habe mal Deinen Code überarbeitet.... scanf("%d", &((*m)[i*n + j])); ...
**
Heißt ja: Adresse des Zeigers auf Array Element i*n+j. Die Indexangabe ist ok, aber ich verstehe nicht, warum man hier einen Zeiger auf Array nehmen muss?!
Wieso funzt denn (m+in+j) nicht? Damit greift man doch auch auf die richtige Adresse zu, oder nicht?!
-
Also: folgender Code ist ebenfalls richtig:
scanf("%d", *m+i*n+j);
.'m' ist ein Zeiger auf einen Zeiger auf 'unsigned int'. '*m' dereferenziert das 'unsigned int'-Array, in dem ja die Werte abgelegt werden sollen. Dazu wird dann der passende Index mit 'i*n+j' errechnet.
Meine erste Fassung '&((*m)[i*n + j])' habe ich gewählt, um genau das klar zustellen: Benötigt wird die Adresse des Elements an der Position 'i*n+j' im dem Array ('*m') auf das 'm' zeigt.
'(m+in+j)' kann nicht stimmen, weil 'm' eben ein Zeiger auf einen Zeiger ist. Wenn 'm' einfach nur ein Zeiger auf 'unsigned int' ist, dann ermittelt dieser Ausdruck den Wert an der gewünschten Position. Dieser Code ist also in 'func2()' (für die Ausgabe) gültig:
printf("%d ", *(m+i*n+j));
[ Dieser Beitrag wurde am 09.06.2003 um 17:43 Uhr von mady editiert. ]