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