Wo ist der Fehler



  • Hallo zusammen

    Ich bin neu hier und bin gerade dabei C zu lernen.
    Ich habe damit begonnen ein Programm zu schreiben, welches für mich Namen nach der Länge sortieren soll.
    Nun kann ich auch nach mehreren Durchläufen den Fehler nicht finden.
    Der Compiler sagt: Unerlaubter Speicherzugriff.

    #include <stdio.h>
    #include <string.h>
    
    void sorting(char* array[]);
    int getElements(char* array[]);
    
    int main(void)
    {
        char* tabelle[] ={
            "Marcel",
            "Davis",
            "Andreas",
            "Simone",
            "George Bush"
        };
        int l = getElements(tabelle);
    
        //Tabelle sortieren nach Länge der Strings
        sorting(tabelle);
    
        //Ausgabe der Namen
        for(int i = 0; i <= l-1;i++)
        {
            printf("%d.name: %s\n",i+1,tabelle[i]);
        }    
        return 0;
    }
    
    void sorting(char* array[])
    {
        int a,b;
        char* temp;
        int l = getElements(array);
    
        //Sortieren der Tabelle
        for(a = 0; a < l-2; a++)
        {
            for(b = a + 1; b < l-2; b++)
            {
                if(strlen(array[a]) > strlen(array[b]))
                {
                    temp = array[a];
                    array[a] = array[b];
                    array[b] = temp;
                } 
            }
        }
    }
    
    //Gibt die Elementanzahl eines Arrays wieder
    int getElements(char* array[])
    {
        int e = 0;
        int i = 0;
        while(array[i])
        {
            e++;
            i++;
        }
        return e;
    }
    

    Ich hoffe jemand kann mir Ratschläge geben, wie ich das Programm besser hinbekomme und gleichzeitig daraus lernen kann.
    Danke


  • Mod

    Dein getElements läuft, bis es einen Nullwert findet. Deine Tabelle ist aber nicht durch einen Nullwert abgeschlossen. Es läuft daher bis hinter das Ende der Tabelle.



  • Habe den Fehler jetzt bereinigt, danke



  • Bei Arrays solltest du immer die Größe an die Funktion mit übergeben.



  • DirkB schrieb:

    Bei Arrays solltest du immer die Größe an die Funktion mit übergeben.

    Ich bin mir nicht ganz sicher was du damit meinst.
    Aber falls es das ist was ich vermute, wie mache ich das?



  • Sand_am_Meer schrieb:

    DirkB schrieb:

    Bei Arrays solltest du immer die Größe an die Funktion mit übergeben.

    Ich bin mir nicht ganz sicher was du damit meinst.
    Aber falls es das ist was ich vermute, wie mache ich das?

    Indem du den Funktionen einen extra Paramter spendierst, der die Längeninformation enthält.
    (Aus der Standard Libraray z.B bei qsort oder fgets )

    Der richtige Typ dazu ist size_t

    void sorting(char* array[], size_t l)
    {
        int a,b;
        char* temp;
    //    int l = getElements(array);
    

    Da wo dein Array definiert ist (bei dir in main) kannst du die Größe mit

    size_t l = sizeof(tabelle / tabelle[0]); // statt tabelle[0] geht auch *tabelle
    

    ermitteln.

    ⚠ In deinen Funktionen geht das nicht mehr, da dort nur noch ein Zeiger ankommt.


Anmelden zum Antworten