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
-
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 beiqsort
oderfgets
)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.