puts führt zum Programmabsturz



  • Hallo zusammen,
    ich bin über ein sehr merkwürdiges Problem gestolpert:
    Und zwar versuche ich in einem Programm unter anderem mit fputs einen String auszugeben, den ich vorher mit fgets eingelesen habe. Ich habe das Programm etwas zusammengestrichen um nur noch den Problemcode übrig zu haben:

    #define LEN_ZEILE 256
    
    int main ( int argc, char *argv[] )
    {
        laenge_zeile   = LEN_ZEILE -1;
        FILE   *eingabe_datei;
        char   *eingabe_datei_name = "hallo.bs";
        char   *eingabe_zeile[LEN_ZEILE];
        ...
        /*öffnen der Dateien usw.*/ if ( ( eingabe_datei = fopen ( eingabe_datei_name, "r" ) ) == NULL )...
        ....
        while ( ( fgets( *eingabe_zeile, laenge_zeile, eingabe_datei) ) != NULL )
        {
            fputs ( *eingabe_zeile, stdout );
        }
    
    exit(0);
    }
    

    bei der Ausgabe mit fputs kommt es zum Speicherzugriffsfehler!

    Jemand eine Idee?

    Vielen Dank vorab...

    Gruss Christian



  • columbus schrieb:

    Ich habe das Programm etwas zusammengestrichen um nur noch den Problemcode übrig zu haben:

    Das ist ja nett gemeint, aber compilieren sollte der Code trotzdem noch 😉

    columbus schrieb:

    laenge_zeile   = LEN_ZEILE -1; // das geht ja schonmal nicht
    
        // hier sind beide * falsch. eingabe_zeile ist ja quasi schon ein char*.
        // Nix dereferenzieren
        while ( ( fgets( *eingabe_zeile, laenge_zeile, eingabe_datei) ) != NULL )
        {
            fputs ( *eingabe_zeile, stdout );
        }
    

    Also für die Zukunft, wenn du den Code vereinfachst, sollte er trotzdem compilierbar sein und das Problem sollte trotzdem noch auftreten.



  • TactX schrieb:

    laenge_zeile   = LEN_ZEILE -1; // das geht ja schonmal nicht
    
        // hier sind beide * falsch. eingabe_zeile ist ja quasi schon ein char*.
        // Nix dereferenzieren
        while ( ( fgets( *eingabe_zeile, laenge_zeile, eingabe_datei) ) != NULL )
        {
            fputs ( *eingabe_zeile, stdout );
        }
    

    Nicht wirklich, drüber steht ja

    char *eingabe_zeile[LEN_ZEILE] ...

    aber das deklariert LEN_ZEILE viele Zeiger auf char, was vermutlich nicht gewollt ist.



  • aber das deklariert LEN_ZEILE viele Zeiger auf char, was vermutlich nicht gewollt ist.

    Ahhrg na klar, schade daß es hier kein Smily gibt der mit der Hand auf seine Stirn haut 😃 Aber vielen Dank erst mal für die schnelle Antwort!

    Und der vollständigkeit halber habe ich hier zu hause auch noch mal den Code verinfacht zu einem einfachen Programm geschrieben:

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    #define LEN_ZEILE 256
    
    int main ( int argc, char *argv[] )
    {
    	int    laenge_zeile   = LEN_ZEILE -1;
    	FILE   *eingabe_datei;
    	char   *eingabe_datei_name;
    	char   *eingabe_zeile[LEN_ZEILE];
    
    	if ( argc < 2 )
    	{
    		printf ("usage: testscanner <infile outfile>\n" );
    		exit (-1);
    	}
    	else if ( argc == 2 )
    	{
    		eingabe_datei_name = argv[1];
    	}
    
    	if ( ( eingabe_datei = fopen ( eingabe_datei_name, "r" ) ) == NULL )
    	{
    		perror ("Konnte Datei nicht oeffnen!\n");
    		exit(-1);
    	}
    
    	while ( ( fgets( *eingabe_zeile, laenge_zeile, eingabe_datei) ) != NULL )
    	{
    		fputs ( *eingabe_zeile, stdout );
    	}
    
    	exit ( 0 );
    }
    

    Gruss Christian



  • Daniel E. schrieb:

    Nicht wirklich, drüber steht ja

    char *eingabe_zeile[LEN_ZEILE] ...

    aber das deklariert LEN_ZEILE viele Zeiger auf char, was vermutlich nicht gewollt ist.

    Jo, hab ich übersehen. Danke.


Log in to reply