dynamisches array mit realloc
-
irgendwie funzt das hier grad garnicht ...
ein "generischer zeigervektor" solls werden, hoffe das geht in die richtung:
{ int **P ; /*wenn ich hier int *P[] schreibe dann kommt "unbekannte grösse" - warum ? sonst ging das immer*/ int Anz,i; int *wert; wert=(int*)malloc(sizeof(int)); *wert=1; for (i=1; *wert!=0;i++) { wert=(int*)malloc(sizeof(int)); printf("int: ");scanf("%d",wert); if (i==1){ P=(int**)malloc(sizeof(int)*i); P[i-1]=wert; } else { P=(int**)realloc(*P,sizeof(int)*i); /*warum nur *P wenn das doch ein **P ist ??*/ P[i-1]=wert; } }
nach dem einlesen des 3. wertes kommt ne ganz seltsame fehlermeldung
-
den Rückgabewert von malloc castet man nicht, da in C void* implizit in andere Pointer gecastet wird
dann musst du Speicher, den du reserviert hast auch wieder mit free freigeben!
P=(int**)malloc(sizeof(int)*i);
du meinst wohl eher
P=malloc(sizeof(int*) /**i da du im 1. Fall eh prüfst, dass i == 1 ist, macht das auch kein Sinn*/);
P=(int**)realloc(*P,sizeof(int)*i); /*warum nur *P wenn das doch ein **P ist ??*/
das sollte so aussehen
P=realloc(P,sizeof(int*)*i);
btw. solltest du prüfen ob malloc oder realloc nicht fehlschlagen
-
Ich antworte gleich mal in einem verbesserten Code:
#include <stdio.h> #include <stdlib.h> int main(void) { //mit *P[] würdest du ein Array von Zeigern deklarieren, die Größe des Arrays hättest du aber nicht angegeben //mit **P ist P ein Zeiger-Zeiger, der auf Zeiger auf int-Variablen zeigen kann //so ist *P ein Zeiger, der auf int-Variablen zeigen kann //so ist **P der Wert der int-Variablen int **P=NULL; int i=0, j, *wert; //Endlosschleife ist besser, damit die abschliessende 0 nicht mit gespeichert wird while(1){ //du solltest immer den Rückgabewert von malloc()/realloc()/calloc() abfangen if((wert=(int*)malloc(sizeof(int))) == NULL){ printf("Speicherplatzmangel...\n"); return 1; } printf("Zahl %2d: ", i+1); scanf("%d", wert); //wenn Ende, dann Speicher von Wert (der 0 enthält) freigeben und Schleife beenden if(*wert==0){ free(wert); break; } //if(i==1) muss nicht sein, du kannst das auch gleich per realloc() erledigen //hier nur P, weil du die Adresse übergibst und nicht den Wert! //*P wäre falsch, da du so die Adresse eines Zeigers des Arrays //übergeben würdest und nicht die des kompletten Arrays //zudem musst du sizeof(int *) schreiben, da du einen Zeiger hinzufügen willst und kein int if((P=(int**)realloc(P,sizeof(int*)*(i+1))) == NULL){ printf("Speicherplatzmangel...\n"); return 1; } P[i++]=wert; } //kleine Ausgabe zum Test, ob alles ordentlich gespeichert ist //zudem werden alle Zeiger und am Ende das komplette Zeigerarray ge'free'd printf("----Testausgabe----\n"); for(j=0; j<i; j++){ printf("Zahl %2d: %8d, Adresse: %10p\n", j+1, *P[j], P[j]); free(P[j]); } free(P); return 0; }
EDIT: Mist... wiedermal zu spät
[ Dieser Beitrag wurde am 03.06.2003 um 09:50 Uhr von RTC editiert. ]
-
danke ihr ...
ich komm mir so bescheuert vor mit dieser komischen sprache
aber jetzt hab ich bald kapiert, glaub ich....
-
@RTC
du benutzt aber immer noch die Casts!
-
@kingruedi: Ich weiß... Alte Angwohnheiten lassen sich eben schlecht ablegen *g*