strcmp -> segmentation fault



  • Hi,

    wie wärs mal mit komplettem Code? Was ist denn "dirname"?



  • Also zuerst mal zu deinem Code:

    malloc (255) <= naja erfüllt wahrscheinlich seinen zweck aber besser:

    char* dir = (char*) malloc (255 * sizeof (char));
    
    if (dir == (char*)NULL)
    // error
    

    ansonsten schaust erstmal was mit dirname ist:

    => ist genug speicher reserviert ?
    => ist es mit \0 abgeschlossen



  • Ohne dir auf die Füße treten zu wollen, das sieht für mich doch sehr nach C aus. In C++ würde man im Zweifel eher so rangehen:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    //...
    
    string dirname = "/home/user/foo/bar";
    string dir = dirname;
    cout << dir << endl;
    

    Der Vorteil ist. dass die Klasse string dir die Speicherverwaltung abnimmt, was gerade zur Vermeidung von segfaults sehr praktisch ist. Was deinen Code angeht, das kann alles mögliche sein - dirname kann im...umm...Gesäß (ich hasse Zensur, ich kann nicht mal Arsch schreiben) sein, dirname kann länger als dir sei usw. - segfaults sind eine ziemlich unberechenbare Sache. Dass der Code mit dem cout-statement funzt ist höchstermutlich nur Zufall; worans genau liegt, kann ich aber ohne genaueren Code nicht sagen.



  • 0xdeadbeef schrieb:

    Ohne dir auf die Füße treten zu wollen, das sieht für mich doch sehr nach C aus. In C++ würde man im Zweifel eher so rangehen:

    in c hätte man den typecast (char*) vor malloc weggelassen...

    0xdeadbeef schrieb:

    Der Vorteil ist. dass die Klasse string dir die Speicherverwaltung abnimmt, was gerade zur Vermeidung von segfaults sehr praktisch ist.

    naja, wenn bei 'dirname' die null erst nach 10mb kommt hat 'string' auch seine schwierigkeiten oder?

    @originalposter: fehlt das 'free' bei dir?



  • fluxy schrieb:

    char* dir = (char*) malloc (255 * sizeof (char));
    
    if (dir == (char*)NULL)
    // error
    

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

    2. NULL castet man nicht nach char*, der compiler macht das schon
    3. if(dir) würde reichen...



  • 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.


Anmelden zum Antworten