strcmp -> segmentation fault
-
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 rauskommen2. 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 rauskommensicher? 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 bitsNein, 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.
-
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:
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;