在尝试将字符串传递给函数时获取错误Segementation fault(core dumped)

时间:2015-08-21 09:40:07

标签: c

当我尝试将当前时间作为字符串传递给我的代码中的函数记录器时,我得到一个错误,说明"分段错误(核心转储)"。但是当我提出static char str[30]时,错误并没有发生。但没有错误,生成的文件无法打开它。

void logger(char * logType, int loggingLevel, char * massage)
{
    FILE *fp = fopen("log.txt", "a");
    fprintf(fp, "%s|%d|%s|%s",logType,loggingLevel,massage,currentTime());
    fclose(fp);   
}

char * currentTime(void)
{
    time_t rawtime;
    char str[30];
    char *string;
    struct tm * timeInfo;
    time(&rawtime);
    timeInfo = localtime(&rawtime);
    strftime(str, 26, "%Y:%m:%d %H:%M:%S", timeInfo);
    return str;

}

所以之前我做了像这样的currentTime函数

char * currentTime(void) {
    time_t rawtime;
    struct tm * timeinfo;
    time(&rawtime);
    timeinfo = localtime(&rawtime);
    return asctime(timeinfo);
}

它工作正常,但这不是我需要显示时间的方式。任何人都可以帮助我。

3 个答案:

答案 0 :(得分:4)

您正在从函数currentTime()返回一个undefined behaviour的本地变量。

将功能签名更改为:char * currentTime(char *inputBuffer, size_t bufLen)

答案 1 :(得分:2)

您正在从str函数返回指向 local 变量(此处为currentTime缓冲区)的指针。

你不能这样做,因为一旦局部变量超出范围(即你离开currentTime函数),它们的内容是未定义的,它们大部分时间都会包含垃圾。

因此,您必须将str声明为静态:

static char str[30];

在这种情况下,str一直存在于程序执行期间,而不仅仅是在执行currentTime函数期间。

但这可能会导致其他问题。

示例:

char *time1;
char *time2;

time1 = currentTime();
...
/* somewhat later */
time2 = currentTime();

/* now time1 and time2 point to the same memory location     */
/* which contains the current time at the second call        */

使用线程时出现问题。

答案 2 :(得分:2)

由于在其他答案中暴露的原因,您的功能不是可重入的,这意味着每次调用它时结果都会被覆盖。要为每个调用创建专用实例,您还可以使用strdup()创建字符串副本,使用后可以使用free()删除:

void logger(char * logType, int loggingLevel, char * massage)
{
    FILE *fp = fopen("log.txt", "a");
    char *sTime = currentTime();    //Get the value
    fprintf(fp, "%s|%d|%s|%s",logType,loggingLevel,massage, sTime);
    free(sTime);    //Release the string if no more needed.
    fclose(fp);   
}

char * currentTime(void)
{
    time_t rawtime;
    char str[30];
    struct tm * timeInfo;
    time(&rawtime);
    timeInfo = localtime(&rawtime);
    strftime(str, 26, "%Y:%m:%d %H:%M:%S", timeInfo);
    return strdup(str);
}