Speicherzugriffsfehler

sieht so aus, als hätte ich keine schreibrechte gehabt. warum, das kann ich mir nicht erklären. jedenfalls verzeichnisse gelöscht und mit mkdir neu erstellt, dann gings
 
Wenn du errno.h einbindest kannst du sogar sowas machen:

Code:
errno=0;
fp=fopen(datei,"w");
if(NULL == fp)
       warn("failed while trying to open datei at line %d\n", __LINE__-2);

Das ist auf jeden fall informativer, als ein segfault. :)
 
Gefällt mir,
was du dir noch angewöhnen kannst ist bei vergleichen konstanten vorne hinzuschreiben. Damit vermeidest du eine potentielle Fehlerquelle von bugs, vergleich
Code:
(a == 2) und (a = 2)
und
Code:
(2 == a) und (2 = a)

Den Funktionsaufruf "sprintf" solltest du auch auf keinen Fall verwenden, wenn schon dann snprintf, wo du die länge vorgeben kannst. Sprintf ist generell eine sehr unsichere Funktion, weil man damit über die größe des Ziels schreiben kann.

Allerdings würd ich dir dringend ans herz legen dir dynamische Speicherallokierung und stringfuntionen anzusehen. Damit kannst du speicher Sparen und beliebig lange strings speichern.

Der Nachteil ist, das du dir unter umständen Memoryleaks einfängst schau dir dafür valgrind an.

File Lesezugriffe macht man auch besser mit fgets oder getline. File Schreibzugriffe sind bequemer mit fprintf.
 
Wenn du errno.h einbindest kannst du sogar sowas machen:

Code:
errno=0;
fp=fopen(datei,"w");
if(NULL == fp)
       warn("failed while trying to open datei at line %d\n", __LINE__-2);

Das ist auf jeden fall informativer, als ein segfault. :)

Es ist halt n server, der soll nicht "informativ" sein. stattdessen sollte er lieber dem client mitteilen, dass die registration aus technischen gründen nicht möglich ist.
 
Alles was in dem if(NULL == fp) Block abläuft tritt nur dann auf, wenn es tatsächlich nicht funktioniert hat, für dich als Programmierer/Administrator wärs dann halt doch vielleicht nicht schlecht, wenn du wissen würdest weshalb ein Fehler aufgetreten ist und nicht nur das ein Fehler aufgetreten ist.

Ich würd die Fehlermeldung auch eher in ein Log schreiben, als sie dem User zuzuschicken.
 
Hi,

bytepool: hast du links zu "guter stil mit c", "stilrichtlinien in c" oder dergleichen? dann les ich mir alles durch und versuche mit einem guten stil das ganze programm nochmal komplett neu zu schreiben.

Ich hab da zu Hause ein paar gute links zu, ja. Hier ein humoristisch angehauchter den ich so direkt wiedergefunden hab:
http://freeworld.thc.org/root/phun/unmaintain.html

Ich denk dabei gehts eher um die Formatierung,

Ja und nein, guter Stil ist mehr als nur eine kohaerente Formatierung, aber sie ist elementaerer Teil davon. Ein anderer extrem wichtiger Teil ist die Namensgebung.

Fuer manche Programmiersprachen wie z.B. Java und Python gibt es eindeutige, "offizielle" style guides, die eigentlich in den meisten Projekten auch verwendet werden und damit de facto Standards sind.
Aber fuer C gibt es so weit ich weiss einen groesseren Wildwuchs [1], z.B. die GNU coding standards [2], die vom Linux Kernel [3][4] oder der K&R style (Kernighan and Ritchie style, nach ihrem Buch). Emacs hat da z.B. extra modes fuer.
Es macht jedenfalls Sinn sich einen Stil auszusuchen und sich dran zu halten, dadurch wird Code deutlich lesbarer.

[1] http://www.chris-lott.org/resources/cstyle/
[2] http://www.gnu.org/prep/standards/
[3] http://www.linuxjournal.com/article/5780
[4] http://www.chris-lott.org/resources/cstyle/LinuxKernelCodingStyle.txt

Die letzte gepostete Version von deinem Code sieht auf jeden Fall schon deutlich besser aus. Persoenlich wuerde ich noch versuchen aussagekraeftigere Variablennamen zu finden.

Edit: Waehrend wir eh schon bei guten C Resourcen sind:
http://drpaulcarter.com/cs/common-c-errors.php
http://c-faq.com/

mfg,
bytepool
 
Zuletzt bearbeitet:
Thema: "dynamische Speicherallokierung"

Code:
char *user;
user = (char *) malloc(30);
soweit für mich klar und einfach. Nur wenn ich jetzt einen Pointer zu einem Pointer habe, wie funktioniert das dann? Ich möchte ja nicht nur einen User haben. Also:
Code:
char **user;
und dann? Wie allokiere ich dann einen neuen pointer? So vielleicht:
Code:
user[0] = (char *) malloc(30);
wobei ich mir vorstellen kann, dass er user[0] dann nicht hat, weil der pointer zum pointer ja noch nicht allokiert wurde. Ich bin da n bissl überfragt.

Thema: "String Funktionen":

string ist doch ne Klasse unter C++, oder? Und in ++ hab ich mich noch nicht eingefunden, kann bisher nur einfaches C.
 
Du kannst auf die pointer pointer genauso zugreifen wie auf arrays.
Code:
char **user= malloc(sizeof(char*)*num);
if(NULL == user)
        printf("allocation failed :(");
user[0]=malloc(sizeof(char)*länge);
...

Du musst aber im Auge behalten wie viele user du hast, du kannst einerseits den letzten pointer auf NULL setzen, oder die größe mitspeichern.
 
Hi,

wobei ich mir vorstellen kann, dass er user[0] dann nicht hat, weil der pointer zum pointer ja noch nicht allokiert wurde.
Korrekt, somit wuerde dein Beispiel nicht funktionieren.

Was du moechtest ist ein Array in dem du die Pointer zu deinen Zeichenketten speicherst, also musst du erstmal Speicher fuer den Array allokieren:
Code:
char ** user = malloc(10 * sizeof(char*));
user[0] = "123456789\n";
printf("%s", user[0]);
free(user);
Wie der Speicher allokiert wird, auf den user[0] zeigt, ist dabei erstmal uninteressant. In meinem Beispiel passiert dies impliziet durch "", man koennte ihn aber natuerlich auch explizit mit malloc allokieren und dann mit strncopy oder so fuellen:

Code:
char ** user = malloc(10 * sizeof(char*));

user[1] = malloc(5 * sizeof(char));
strncpy(user[1], "foo\n", 5);
printf("%s", user[1]);

free(user[1]);
free(user);

string ist doch ne Klasse unter C++, oder?
String ist Englisch fuer Zeichenkette, und unter C-Strings versteht man Null-terminierte char Arrays. Du findest z.B. einige Funktionen zum kopieren von Strings und anderen gaengigen Operationen in string.h. Aber String ist auch eine Klasse in C++.

Edit:
Code:
[...]
if(NULL == user)
        printf("allocation failed :(");
Das checken auf NULL vergess' ich immer wieder, gut dass ich nicht mehr viel in C mache. ;)

mfg,
bytepool
 
Zuletzt bearbeitet:

Ähnliche Themen

Kernel Kaltstart / reboot?

Console I/O mit loggen

SELinux und IPTV

Unix Webserver mit HTML Seite erstellen

E/A-Fehler (.snapshots is not a btrfs subvolume).

Zurück
Oben