c中使用linux的分割错误(core dumped) – 特例

我基本上是试图创build一个date和时间作为其名称的日志文件。 这是我的代码

char logger [500]; time_t time1; struct tm * timeinfo; time (&time1); timeinfo = localtime (&time1); sprintf(logger, "TestTreiber_%d%d%d%d%d%d.log",timeinfo->tm_year+1900,timeinfo->tm_mon+1,timeinfo->tm_mday,timeinfo->tm_hour,timeinfo->tm_min,timeinfo->tm_sec); printf("All logging during this test is done in : %s",logger); sprintf(logger, "prot/%s",logger);//STEP 1: I encounter the error here FILE *logFile; logFile= fopen(logger,"w"); 

没有第一步,每件事情都很好。 它在我的程序所在的同一个文件夹中创build了一个我想要的名字的日志文件。 但是当我把第一步加到混音中时,会给我这个错误。

 Segmentation Fault (core dumped) 

我是Linux的新手,但是我知道它和内存有关,所以我增加了分配给logging器[500]的内存(早期的255,它工作正常)。 但我似乎无法解决这个问题。 保存文件夹确实存在于我正在运行这个目录。 请帮忙!

PS对不起大写字母的错误使用,我正在使用德语键盘。

你不应该在你的代码中这样做,

 sprintf(logger, "prot/%s",logger); 

从sprintf的man页引用,

一些程序粗暴地依赖于如下的代码,

sprintf(buf, "%s some further text", buf);

将文本追加到buf 。 但是,这些标准明确指出,如果在调用sprintf(),snprintf(),vsprintf()和vsnprintf()时source缓冲区和destination缓冲区重叠,则结果是不确定的。 根据所使用的gcc版本和所使用的编译器选项,上述调用不会产生预期的结果。

正如其他人所说, sprintf的目标缓冲区和字符串参数不能重叠。

您先构建基本名称,然后打印它,然后想要预先指定它的路径。 您可以使用两个不同的缓冲区来存储基本名称和路径,但是您也可以一次构建整个路径,并从<libgen.h>提取包含基本名称的路径的basename以进行打印:

 const char *prefix = "prot"; char logger [500]; time_t time1 = time(NULL); struct tm *ti = localtime (&time1); snprintf(logger, sizeof(logger), "%s/TestTreiber_%d%02d%02d%02d%02d%02d.log", prefix, ti->tm_year + 1900, ti->tm_mon + 1, ti->tm_mday, ti->tm_hour, ti->tm_min, ti->tm_sec); printf("Logger is '%s'.\n", basename(logger)); printf("(Full path is '%s'.)\n", logger); 

(你应该输出所有字段除了第二位数字以外的所有字段,并用零%02d格式填充它,这样文件名是明确的。)

因此,首先将sprintf()更改为snprintf()但是还必须更改提供给该函数的参数。 事实上,来源和目的地必须有所不同。 如果他们不是,我想它会给出未定义的行为。

所以做这样的事情:

 sprintf(newlogger, "prot/%s",logger);