strcmp -> segmentation fault



  • aber das ist doch alles C...
    mag mich noch erinnern...



  • otze schrieb:

    dazu sag ich nur: AUA
    nach dem standard ist char immer genau 1 byte groß, deshalb kann aus sizeof(char) immer nur 1 rauskommen 🙄

    sicher? wozu gibt's dann CHAR_BIT in limits.h?
    ich dachte immer 1 byte wäre die _minimalgrösse_ für chars d.h. char kann auch breiter sein als 8 bits



  • net schrieb:

    sicher? wozu gibt's dann CHAR_BIT in limits.h?
    ich dachte immer 1 byte wäre die _minimalgrösse_ für chars d.h. char kann auch breiter sein als 8 bits

    Nein, ein char ist ein Byte. Wieviel Bits allerdings ein char (Byte) hat, ist implementationsspezifisch. Auch wenn man heutzutage auf gängigen Systemen von 8 ausgehen kann.

    otze schrieb:

    dazu sag ich nur: AUA

    Wieso AUA?

    char* dir = (char*) malloc(255 * sizeof (char));
    

    ist doch auch nicht falscher als

    char* dir = (char*) malloc(255);
    

    fluxy schrieb:

    if (dir == (char*)NULL)
    // error
    

    Wieso so umständlich? Ein

    if (!dir)
    // error
    

    reicht doch vollkommen aus.



  • Also erstmal danke für die vielen Antworten, habe ich echt nicht mit gerechnet.

    Ich benutze char* aus Gewohnheit, werds aber mal mit der Klasse string versuchen.

    Wollte meinen Beitrag so kurz wie möglich halten, da der Rest ja zu funktionieren scheint und nur an dieser Stelle Probleme auftreten, wenn ich die Ausgabe weglasse.

    Hier aber mal die ganze Funktion:

    int getDirSize(char *dirname){
    	struct dirent **namelist;
    
    	int n;
    	int size = 0;
    	DIR *d;
    	char *dir = (char *) malloc(255); 
    	strcpy(dir,dirname);
    	cout << dir << endl;
    
    	n = scandir(dirname,&namelist,0,alphasort); 
    
    	if (n < 0)
            	perror("scandir");
        	else {
            	while(n-- > 2) { 
    			if ((open(strcat(dir,namelist[n]->d_name),O_DIRECTORY | O_NOFOLLOW)) != -1){ 
    			cout << dir << endl;
    			size += getFileSize(dirname,namelist[n]->d_name); 		//Größe des Verzeichnisses addieren
    			size += getDirSize(strcat(dir,"/"));				// Inhalt des Verzeichnisses addieren(inkl. Unterverzeichnisse)
    			strcpy(dir,dirname);
    			}
    		else 
    		strcpy(dir,dirname);
    		size += getFileSize(dirname,(char *)namelist[n]->d_name);
                	free(namelist[n]);
            	}
            free(namelist);
    	return size;
        	}
    

    Das ganze Programm wäre zu lang, aber die Funktion wird aus main nur einmal aufgerufen und ansonsten ruft sie sich immer rekursiv auf, also denke ich reicht zu sagen, dass der erste Aufruf so aussieht:

    int s = getDirSize(argv[1]);
    

    Ich programmiere noch nicht lange in c/c++ bin normaler Weise eher Java Programmierer, also hab ich noch meine leichten Probleme mit pointern usw. also verzeiht mir den schlechten Programmier - Stil 😛

    Danke Mayhem



  • groovemaster schrieb:

    Nein, ein char ist ein Byte.

    nö, ein byte sind immer 8 bits

    groovemaster schrieb:

    Wieviel Bits allerdings ein char (Byte) hat, ist implementationsspezifisch.

    deswegen ja. ein char ist mindestens 8 bits breit, darf aber auch mehr haben.
    byte != char



  • net schrieb:

    groovemaster schrieb:

    Nein, ein char ist ein Byte.

    nö, ein byte sind immer 8 bits

    So ist's richtig. Immer einfach mal drauflos behaupten. Natürlich ohne Begründung oder Beleg. Dann hoffen, dass kein Durchblicker vorbeischaut und dich enttarnt.
    Mit dem letzten Punkt hast du hier leider pech gehabt. Ich bin hier nämlich sicher nicht der einzige, der weiß, dass 1 Byte = 8bit im Umfeld von C++ nicht garantiert ist. Achso: den Beweis für meine Aussage findest du übrigens im C++ Standard Abschnitt 1.7/1.



  • HumeSikkins schrieb:

    Ich bin hier nämlich sicher nicht der einzige, der weiß, dass 1 Byte = 8bit im Umfeld von C++ nicht garantiert ist. Achso: den Beweis für meine Aussage findest du übrigens im C++ Standard Abschnitt 1.7/1.

    den begriff 'byte' (und dessen bedeutung) gab es sicher schon, als die autoren des c++ standards noch die wolle aus'm teddybären gezupft haben. den können die nicht mal eben umdefinieren.



  • Ich mach einfach ein malloc(255*sizeof(char)); draus und gut is 😉

    War sowieso ne Nachlässigkeit von mir.



  • Hallo,
    zeig mir bitte mal eine allgemeingültige Definition von Byte die 1 Byte = 8bit vorschreibt. Ich habe hier viele verschiedene Definitonen. Einige schreiben "nearly always 8bit" andere "usually 8bit" wieder andere "amount of memory smaller than a word" oder "enough to represent one character of alphanumeric data".

    Und davon abgesehen: wir sind hier im *Standard*-C++ Forum und deshalb sind hier natürlich auch die Definitionen des C++ Standards am Relevantesten.

    Tut mir leid, aber deine Aussage wird auch durch Teddybärbilder nicht richtiger.



  • net schrieb:

    HumeSikkins schrieb:

    Ich bin hier nämlich sicher nicht der einzige, der weiß, dass 1 Byte = 8bit im Umfeld von C++ nicht garantiert ist. Achso: den Beweis für meine Aussage findest du übrigens im C++ Standard Abschnitt 1.7/1.

    den begriff 'byte' (und dessen bedeutung) gab es sicher schon, als die autoren des c++ standards noch die wolle aus'm teddybären gezupft haben. den können die nicht mal eben umdefinieren.

    http://en.wikipedia.org/wiki/Byte 🙄



  • Genau und in dieser fernen Zeit, meinte man mit Byte zunächst nur 6 Bit. Das kannst du nicht einfach umdefinieren. 😎

    http://medic.bgu.ac.il/comp/course/defs/byte.html

    Bye, TGGC (Für echte Fans)



  • Blue-Tiger schrieb:

    http://en.wikipedia.org/wiki/Byte 🙄

    wow, ihr habt recht!
    danke, man lernt doch immer was dazu bzw. beseitigt alte 'vorurteile'

    edit: ich werd' ab jetzt nur noch 'octet' sagen :p



  • Hab das Problem behoben, bin zu sorglos mit den pointern umgegangen, konnte nur schief gehen 😛



  • groovemaster schrieb:

    otze schrieb:

    dazu sag ich nur: AUA

    Wieso AUA?

    char* dir = (char*) malloc(255 * sizeof (char));
    

    ist doch auch nicht falscher als

    char* dir = (char*) malloc(255);
    

    syntaktisch,stylistisch oder logisch falsch?
    syntax ist richtig, mein compiler meckert nicht
    logisch ist es auch richtig, er wollte ja auch ein 255 byte großes char-array haben
    stylistisch ist es abzuraten,was die sache aber nicht falsch macht 😉



  • otze schrieb:

    stylistisch ist es abzuraten,was die sache aber nicht falsch macht 😉

    Wieso ist davon abzuraten? Ich bin zwar jemand, der eher dazu neigt, kompakten Code zu schreiben. Hier sehe ich aber keinen Anlass zum Meckern. Was ist, wenn jetzt jemand wchar_t benutzen möchte? Dann muss er zwangsläufig auf die sizeof Variante zurückgreifen. Und komm mir jetzt bitte nicht mit

    wchar_t* dir = (wchar_t*) malloc(510);
    

    oder ähnlichen Geschichten. Dass das falsch ist, sollte ja bekannt sein.



  • Was ist, wenn jetzt jemand wchar_t benutzen möchte?

    Wenn wir von äpfeln reden, dann können wir auch gleich mit birnen anfangen. 🙄

    mir ist klar, dass wenn der typ der zeichenkette T ist, man die größe*sizeof(T) nehmen muss, aber ich seh hier kein template, siehst du eins? klar, man könnte den code ja copy pasten und dann einfach das sizeof verändern, aber dann könnte man in dem fall auch genausogut ein sizeof in den kopierten code einfügen, oder etwa nicht?



  • Die Diskussion sollte man sinnvollerweise im C-Forum fortsetzen. In C++ ist malloc sowieso Schwachfug, da benutzt man new und hat das Problem nicht:

    char *foo = new char[255];
    //...
    delete[] foo;
    


  • mit new hatte ich es zuerst, aber dann war die Ausgabe vom programm nciht korrekt, hatte an andrer telle schon nen Fehler, auch wenn ich mir nicht sicher bin wo.

    Hab die eine Funktion neu geschrieben, und diesmal die klasse string benutzt und alles geht.



  • otze schrieb:

    Wenn wir von äpfeln reden, dann können wir auch gleich mit birnen anfangen. 🙄

    Wieso Äpfel und Birnen? char und wchar_t verhalten sich zueinander eher wie kleine Äpfel zu grossen. 😉
    Naja, auch egal. string ist ja eh eine bessere Wahl.



  • groovemaster schrieb:

    otze schrieb:

    Wenn wir von äpfeln reden, dann können wir auch gleich mit birnen anfangen. 🙄

    Wieso Äpfel und Birnen? char und wchar_t verhalten sich zueinander eher wie kleine Äpfel zu grossen. 😉

    hmm ich hätte doch nur das "was ist,wenn" quoten sollen 🙄

    najut, dann hol ich das jetzt mal nach:

    Was ist, wenn

    wenn das wörtchen wenn nicht wär, dann wär mein vater millionär


Anmelden zum Antworten