URL: https://www.overclockers.at/coding-stuff/c_warning_iso_c90_does_not_support_205157/page_1 - zur Vollversion wechseln!
Hi!
Code:#define _GNU_SOURCE #include <stdio.h> #include <stdlib.h> int main( void ) { FILE *fp; char *line = NULL; size_t len = 0; ssize_t read; fp = fopen( "/etc/motd", "r" ); if ( fp == NULL) exit( EXIT_FAILURE ); while ( ( read = getline( &line, &len, fp ) ) != -1 ) { printf( "Retrieved line of length %zu:\n", read ); printf( "%s", line ); } if ( line ) free( line ); exit( EXIT_SUCCESS ); }
- warnings ignoriern is selten gut... vor allem wenn es dir sagt, dass der C90 Standard das ding ned kennt. ich kannte es auch ned
- strlen(line)
- ka, exit tut auch nix anders als das programm zu beenden.
für "%zu" habe ich einen workaround gefunden:
"printf( "Retrieved line of length %d:\n", (int) read );"
bzgl. exit:
exit terminiert das programm egal was gerade los ist (zack, bumm, finster wirds)
return kehrt zum aufrufer zurück
entscheidend vor allem bei rekursion.
ist ja auch die main-function..danach wirds nunmal dunkel 
Zu diesem Beispiel habe ich noch eine Frage:
Irgendwo habe ich gelesen, das getline() nicht zum Umfang von ANSI C gehört,
darum habe ich mir erwartet, dass ich beim Kompilieren mit den Optionen -ansi -pedantic eine Fehlermeldung bekomme.
Stimmen meine Erwartungen bezüglich dieser Optionen nicht oder gehört getline() doch zum Umfang von ANSI C?
1: #define _GNU_SOURCE
unterbindet wohl die fehlermeldung. gnu c hat die funktion, ansi c nicht
Zitat von Nicoist ja auch die main-function..danach wirds nunmal dunkel
Wenn eine Funktion nicht zum ansi c90 standard gehört sollte dir dieser Aufruf ein Warning liefern (weil funktion undefined).Zitat von lama007Zu diesem Beispiel habe ich noch eine Frage:
Irgendwo habe ich gelesen, das getline() nicht zum Umfang von ANSI C gehört,
darum habe ich mir erwartet, dass ich beim Kompilieren mit den Optionen -ansi -pedantic eine Fehlermeldung bekomme.
Stimmen meine Erwartungen bezüglich dieser Optionen nicht oder gehört getline() doch zum Umfang von ANSI C?
ZitatCONFORMING TO
Both getline() and getdelim() are GNU extensions. They are available since libc 4.6.27.
Aha, und ich habe gleich nachgeschaut: wenn alles passt steht unter "CONFORMING TO" nur "C89, C99."
Zur Speicherbefreiung habe ich folgenden Satz gefunden:
"Falls ein Speicherbereich freigegeben wird, der nicht zuvor mit malloc(), calloc() oder realloc() alloziiert wurde, kann dies katastrophale Folgen haben."
in der man-page von getline steht:
"If *lineptr is NULL, then getline() will allocate a buffer for storing the line, which should be freed by the user program."
Muss man immer die man-pages der Funktionen studieren, um zu wissen, ob es free() braucht oder nicht?
Zitat von lama007Muss man immer die man-pages der Funktionen studieren, um zu wissen, ob es free() braucht oder nicht?
Es ist generell ratsam, bei jeder Funktion, die du nicht aus dem Effeff kennst, einen kurzen Blick ins Manual zu werfen. Mit dem richtigen Setup deines Editors (bzw. deiner IDE) ist das ja kein wirklich schlagender Zeitverlust.
Wo hast du denn den Satz her?Zitat von lama007Zur Speicherbefreiung habe ich folgenden Satz gefunden:
"Falls ein Speicherbereich freigegeben wird, der nicht zuvor mit malloc(), calloc() oder realloc() alloziiert wurde, kann dies katastrophale Folgen haben."
Hört sich ja nach Weltuntergang an...Sagt "man 3 free". Man könnte natürlich annehmen dass wenn dieses Problem im Programm einer Kernkraftwerks-Steuerung zuschlägt tatsächlich katastrophale Folgen entstehen könnten, aber ich halte das etwas weit hergeholtZitatfree() frees the memory space pointed to by ptr, which must have been returned by a previous call to malloc(), calloc() or realloc(). Otherwise, or if free(ptr) has already been called before, undefined behaviour occurs. If ptr is NULL, no operation is performed.

Der Satz steht hier:
http://openbook.galileocomputing.de...9.htm#Xxx999328
Kann man das so sagen: wenn ich keinen Speicher von Hand reserviere, brauche ich ihn normalerweise auch nicht selbst befreien, außer bei ein paar Funktionen?
Sollst du eigentlich auch nicht, weil du ja nicht weißt was dann passiert.Zitat von lama007wenn ich keinen Speicher von Hand reserviere, brauche ich ihn normalerweise auch nicht selbst befreien, außer bei ein paar Funktionen?
geendet...
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025