strncpy, Programmabsturz



  • Hallo liebe Community,
    bin ein C-Neuling und probiere gerade einige Möglichkeiten der Sprache aus. Mein Programm erleidet an einer bestimmten Stelle immer einen Abbruch. Das Programm fahre ich unter Windows.

    Der Code ist auf die wichtigsten Teile gekürzt.

    #include <string.h>
    #include <stdio.h>
    
    int isConfUNIX(char *configsource)
    {
    	if(strstr(configsource, "[UNIX]") != 0)
    	{
    		return 1;
    	}
    	else
    	{
    		return 0;
    	}
    }
    
    int isConfWINDOWS(char *configsource)
    {
    	if(strstr(configsource, "[WINDOWS]") != 0)
    	{
    		return 1;
    	}
    	else
    	{
    		return 0;
    	}
    }
    
    int main()
    {
    	char configsource[] = "[WINDOWS]\n[UNIX]";
    	char *confread; //return value
    
    	char *sectUNIX; //where [UNIX] section begins
    	char *sectWINDOWS; //where [WINDOWS] section begins
    	int beginsFirstUNIX = 0; //begins [UNIX] first?
    
    	if(isConfUNIX(configsource) != 0) //contains [UNIX] section?
    	{
    		sectUNIX = strstr(configsource, "[UNIX]"); //position of [UNIX] section
    	}
    	if(isConfWINDOWS(configsource) != 0) //contains [WINDOWS] section?
    	{
    		sectWINDOWS = strstr(configsource, "[WINDOWS]"); //position of [UNIX] section
    	}
    
    	if(sectUNIX < sectWINDOWS)
    	{
    		beginsFirstUNIX = 1;
    	}
    
    	if(beginsFirstUNIX == 1)
    	{
    #ifdef UNIX
    		strncpy(confread, configsource, strlen(configsource) - strlen(sectWINDOWS));
    #endif
    #ifdef _WIN32
    		confread = sectWINDOWS;
    #endif
    	}
    	else
    	{
    #ifdef UNIX
    		confread = sectUNIX;
    #endif
    #ifdef _WIN32 //DIESER ZWEIG BRINGT DAS PROGRAMM ZUM ABSTURZ
    		strncpy(confread, configsource, strlen(configsource) - strlen(sectUNIX));
    #endif
    		}
    
    	return 0;
    }
    

    Der kommentierte Programmzweig bringt mein Programm zum Absturz. Könnt ihr mir helfen? Bin für jede Hilfe dankbar!

    MfG
    finalCountdown



  • confread zeigt in die Wallachei. strncpy versucht dort hinzuschreiben und das verursacht einen Segmentation fault. Du musst dir Speicher für confread besorgen.

    Vor Zeile 69 eingeschoben:

    confread = malloc(strlen(configsource) - strlen(sectUNIX)+1);
    

    Das +1 ist für das '\0'-Zeichen was anzeigt dass der String zu Ende ist.



  • Danke für die schnelle Hilfe!
    Mein Programm meckert aber an deinem Code mit den Worten: "error: invalid conversion from `void*` to `char*`".



  • Das liegt daran, dass du einen C++-Compiler hast. Entweder du sagst ihm dass du c hast (Datei von .cpp in .c umbenenn, beim gcc kann man -x c als Option angeben), oder du bleibst bei deinem C++-Compiler und machst

    confread = (char *)malloc(strlen(configsource) - strlen(sectUNIX)+1);
    

    draus.



  • Danke, du bist echt weise! Klappt nun alles. Einwandfrei.
    Hab ich dir schon ein Frohes Neues gewünscht? 🙂



  • nwp2 schrieb:

    ... oder du bleibst bei deinem C++-Compiler und machst

    confread = (char *)malloc(strlen(configsource) - strlen(sectUNIX)+1);
    

    draus.

    ich würd dich lieben hättest den satz weggelassen 🙄


Anmelden zum Antworten