C: Segmentation fault, Strings
-
Hallo c_community
bei diesem code verstehe ich ein paar anomalien nicht, ich wäre sehr dankbar, wenn ein paar string gurus mir erklären würden, was falsche ist, im voraus dankeUnd zwar:
- bfhd array bekommt eine feste grösse(ca. 7), die grösse wird durch strlen ermittelt. ein array wird erstellt, danach füge ich noch '\0' am ende hinzu und kopiere den name string, was übergeben wurde, rüber. und wenn ich auf die 100 stelle zugreife, bekomme ich keinen fehler, warum ??
- *f_name = bffn[0]; ist am ende der funktion prepare und da kommt der fehler, warum??? denn bffn beinhaltet nur chars und f_name ist ein char pointer.
testausgabe ist am schluss
#include <stdio.h> #include <string.h> #include <ctype.h> #include <stdbool.h> char * c_name; char * h_def; // Prepares the strings void prepare(char * name){ char bffn[strlen(name) + 1]; char bfcn[strlen(name) + 1]; char bfhd[strlen(name) + 1]; bffn[strlen(name)] = '\0'; bfcn[strlen(name)] = '\0'; bfhd[strlen(name)] = '\0'; strcpy(bffn, name); strcpy(bfhd, bffn); int i = 0; // tolower while(bffn[i] != '\0'){ bffn[i] = tolower(bffn[i]); i++; } strcpy(bfcn, bffn); bfcn[0] = toupper(bfcn[0]); // Warum ist es möglich??? bfhd[100] = 'Y'; printf("Wert von bfhd[100] = %c\n", bfhd[100]); int j = 0; // TOUPPER while(bfhd[j] != '\0'){ bfhd[j] = toupper(bfhd[j]); j++; } printf("---------Hier\n"); char * f_name; *f_name = bffn[0]; } int main(int argc, char* argv[]){ prepare(argv[1]); }
Ausgabe:
aaa@bbb:~/Desktop$ ./test clAsS1
Wert von bfhd[100] = Y
---------Hier
Segmentation fault
-
Über Arraygrenzen hinaus zu schreiben/lesen ist undefiniertes Verhalten. Prinzipiell kann dir da alles mögliche passieren. Würdest du noch weiter "aus dem Array raus" gehen, würde wohl dort direkt der segfault kommen.
Die Zuweisung
char * f_name; *f_name = bffn[0];
Ist falsch weil f_name ein nichtinialisierter Zeiger ist. Der zeigt in den Wald und du schreibst dort hin. Im übrigen auch undefiniertes Verhalten.
Klar?
-
C überprüft nicht die Arraygrenzen.
Kann es auch nicht. Wenn du den Zusammenhang zwischen Zeigern und Arrays (bei Funktionen) verstanden hast, weißt du auch warum.Wenn du damit Probleme hast, musst du dir eine andere Sprache suchen.
-
strcpy kopiert die '\0' natürlich mit.
Und ob am Ende vom char-Array eine '\0' steht, ist beim schreiben in das Array egal.
-
Zum ersten undefiniertem Verhalten:
Dobi (im C++-Forum) schrieb:
Das Verhalten ist sehr wohl definiert. Bei dir aufm Rechner wirds immer wunderbar laufen. Beim Kunden wirds dir peinlichst um die Ohren fliegen.
-
-
ok alles verständlich, sehr danke
es muss ein null her...
soweit ich weiß, ist null in c schon vordefiniert, stdlib glaube ich..
ich hab beide möglichkeiten ausprobiert, hat nicht viel gebracht... auch null definiert als
#define NULL (void *)0
und ein mal als
#define NULL ((char *)0)
char * f_name = 0; *f_name = bffn[0];
char * f_name = NULL; *f_name = bffn[0];
-
Tja, 0 ist natürlich die vertrauenswürdigste Speicheradresse im gesamten System. Wer würde 0x0 nicht seine Daten anvertrauen?
-
NULL ist der Wert für einen nicht gültigen Zeiger.
char * f_name = NULL; if (f_name) // also nie. *f_name = bffn[0];
Du brauchst schon einen (gültigen) Speicherplatz wo der Zeiger hinzeigt.
Eine char Variable wäre nicht schlecht.char c_name; char * f_name = &c_name; if (f_name) // jetzt klappt es. *f_name = bffn[0];
Klar kannst du hier auch gleich
c_name = bffn[0];
nehmen.