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* 😃


Anmelden zum Antworten