Zweidimensionales Array erstellen (mit malloc)



  • bzw laenge Elemente



  • Scheinbar mache ich noch irgendwas verkehrt, ich habe nun meinen Code durch:

    char **Bezeichnung2 = calloc(laenge,sizeof(char*));
    for(i=0;i<laenge;i++)
    {
    Bezeichnung2[laenge] = malloc(20*sizeof(char));
    }
    for(i=0;i<laenge;i++){  
        strcpy(Bezeichnung2[i],Bezeichnung[i]);
    }
    

    ersetzt, nun stürzt das Programm bei der Ausgabe ab



  • Wutz schrieb:

    Ja.
    Etwas eleganter wäre noch
    int **myPtr = calloc(5,sizeof(int*));

    Dem kann ich keine Eleganz abgewinnen, bestenfalls Überfluss, denn die Zeiger werden anschließend sofort zugewiesen. Wozu also unnötigerweise doppelte Initialisierung?

    Metalmind01 schrieb:

    Scheinbar mache ich noch irgendwas verkehrt

    Schreib doch mal Bezeichnung2[i] anstatt Bezeichnung2[laenge].



  • Okay, sorry, das war einfach dumm...

    Nun sieht das ganze so aus:

    char **Bezeichnung2 = malloc(laenge*sizeof(char*)); 
    for(i=0;i<laenge;i++)
        {
            Bezeichnung2[i] = malloc(100*sizeof(char));
        }
    for(i=0;i<laenge;i++){  
        strcpy(Bezeichnung2[i],Bezeichnung[i]);
    }
    


  • Nun kommt bei der Ausgabe etwas merkwürdiges raus, zwei komische, immer unterschiedliche Zeichen gefolgt von ")".
    Was haltet ihr denn nun von meinem Code?



  • Metalmind01 schrieb:

    Nun kommt bei der Ausgabe etwas merkwürdiges raus, zwei komische, immer unterschiedliche Zeichen gefolgt von ")".
    Was haltet ihr denn nun von meinem Code?

    das da nen error driennen ist noch irgenwo



  • Okay, ich gehe das alles mal Zeile für Zeile hier durch, vielleicht fällt euch ja der Denkfehler auf den ich übersehen habe...

    char* *Bezeichnung2 = malloc(laenge*sizeof(char*));
    

    char* *Bezeichnung2 müsste eigendlich dasselbe sein wie char **Bezeichnung oder?
    hier wird ie erste Dimension des Arrays erstellt, mit der Anzahl laenge und von der größe char*, was mit dem char aus Bezeichnung kompatibel sein müsste.

    for(i=0;i<laenge;i++)
    {
    Bezeichnung2[i] = malloc(20*sizeof(char*));
    }
    

    Die zweite Dimension wird für Bezeichnung2 erzeugt, jeweils 20 Zeichen werden für einen String reserviert, auch diese Dimension hat die Größe char*.

    for(i=0;i<laenge;i++){  
    		strcpy(Bezeichnung2[i],Bezeichnung[i]);
        }
    

    Am Ende wird laenge mal der Inhalt von Bezeichnung[100][20] (in char) in ein jetzt eigendlich identisches Zeigerarray des Typs char* *Bezeichnung[laenge][20] kopiert. Der Index [i] beschreibt die erste Dimension und schreibt so laenge mal Strings der maximalen Größe [20] in die Felder.
    Soweit ist doch eigendlich alles richtig und müsste funktionieren, oder?

    Gruß
    Metalmind


  • Mod

    Metalmind01 schrieb:

    Okay, ich gehe das alles mal Zeile für Zeile hier durch, vielleicht fällt euch ja der Denkfehler auf den ich übersehen habe...

    char* *Bezeichnung2 = malloc(laenge*sizeof(char*));
    

    char* *Bezeichnung2 müsste eigendlich dasselbe sein wie char **Bezeichnung oder?
    hier wird ie erste Dimension des Arrays erstellt, mit der Anzahl laenge und von der größe char*, was mit dem char aus Bezeichnung kompatibel sein müsste.

    Ja. Wo die Sternchen stehen ist total egal.

    for(i=0;i<laenge;i++)
    {
    Bezeichnung2[i] = malloc(20*sizeof(char*));
    }
    

    Die zweite Dimension wird für Bezeichnung2 erzeugt, jeweils 20 Zeichen werden für einen String reserviert, auch diese Dimension hat die Größe char*.

    Knartsch! Wie kommst du auf char* als Größe? Ich meine: Ja, da steht sizeof(char*), aber das ist falsch!

    Auf der linken Seite steht ja ein char* (Weil Bezeichnung2 ein char** ist und einmal dereferenziert wird). Und worauf sollte ein char* wohl zeigen?



  • Metalmind01 schrieb:

    Okay, ich gehe das alles mal Zeile für Zeile hier durch,

    nein. du baust nen neuen fehler ein.

    malloc(20*sizeof(char*));
    

    damit reservierst du mehr speicher, als du willst (sizeof(char*) > sizeof(char)).
    muss heißen

    malloc(20*sizeof(char));
    

    es reicht auch

    malloc(20);
    

    weil sizeof(char) immer 1 ist.



  • Ich habe keinen neuen Fehler eingebaut, aber jetzt einen alten berichtigt 😃
    Warum da so ein Zeichenmatsch rauskommt ist mir aber immernoch schleierhaft, eigendlich sollten die Daten nun ordnungsgemäß kopiert werden...oder nicht?


  • Mod

    Metalmind01 schrieb:

    Ich habe keinen neuen Fehler eingebaut, aber jetzt einen alten berichtigt 😃
    Warum da so ein Zeichenmatsch rauskommt ist mir aber immernoch schleierhaft, eigendlich sollten die Daten nun ordnungsgemäß kopiert werden...oder nicht?

    Die Kopierroutine funktioniert, keine Angst. Aber du machst abwechselnd Fehler beim Speicher reservieren und bei der Angabe des Ortes wo die Zeichen hinkopiert werden sollen und bei der Angabe welche Zeichen ausgegeben werden sollen.



  • Die Kopierroutine funktioniert, keine Angst.

    Also ist dieser Teil

    for(i=0;i<laenge;i++)
    {  
        strcpy(Bezeichnung2[i],Bezeichnung[i]);
    }
    

    richtig

    Aber du machst abwechselnd Fehler beim Speicher reservieren

    char* *Bezeichnung2 = malloc(laenge*sizeof(char*)); 
    for(i=0;i<laenge;i++)
    {
        Bezeichnung2[i] = malloc(20);
    }
    

    Da müssten doch nun eigendlich alle Fehler behoben sein

    und bei der Angabe des Ortes wo die Zeichen hinkopiert werden sollen

    Das müsste dann ja diese Zeile sein

    strcpy(Bezeichnung2[i],Bezeichnung[i]);
    

    und bei der Angabe welche Zeichen ausgegeben werden sollen.

    Das ist dann dieser Teil:

    for (i=0;i<laenge;i++)
    {
        printf("%s\n",&Bezeichnung2[i]);
    }
    

    der meiner Meinung nach richtig ist



  • soweit richtig?


  • Mod

    Metalmind01 schrieb:

    soweit richtig?

    Kommt denn das richtige raus?

    Der letzte Teil müsste falsch sein. Der Adressoperator hat da nichts zu suchen.



  • Damit läuft alles wunderbar, danke für deine Geduld!
    Und entschuldigung wenn ich genervt habe... 😞


Anmelden zum Antworten