语句在main中运行但在从函数调用时不运行

时间:2017-11-16 02:48:05

标签: c

对不起。我真的试着自己解决这个问题。但我不明白。当我将它们放在main中时,这些陈述运行正常。但是当我在main的函数中调用它们时,会发生分段错误。这是否意味着内存溢出?

void displayTime(char state[]) {
    time_t totalSec = time(NULL);//total no of secs since EPOCH
    struct tm *currTime = localtime(&totalSec); //store local time in struct declared in time.h
    char *result; 
    strftime(result, 20, "%Y:%m:%d %H:%M:%S", currTime); //E.g. 2017:11:12 12:30:48 Max is 20 characters including \0
    printf("Program at %s\n", result );
}

int main() {
    displayTime("started");
    return 0;
}

2 个答案:

答案 0 :(得分:2)

result中分配导致问题的内存。

在你的情况下,它将是

result = malloc(sizeof(char)*BUFFSIZE);
if( result == NULL ){
   fprintf(stderr,"Error");
    exit(1);
}

必须对分配的内存进行相应的free调用,此处为

free(result);

访问未初始化的变量也是未定义的行为。

同样没有malloc,您可以简单地执行此操作

char result[20];

strftime(result,20, "%Y:%m:%d %H:%M:%S", currTime);

我之前使用state进行编辑也是不可能的。 (没有注意到它是文字字符串)因为字符串文字属于内存的只读部分。现在我们在这里尝试编辑或修改它。那是错的。

其次,即使它不是只读的,它仍然没有内存来容纳你要写的字符。因为尺寸不够大。

进一步说明

要澄清问题,请查看result变量。它是char*类型。它应该包含char变量的地址。现在当你宣布它。然后它包含一个不确定的值。

它是否指向任何有意义的东西?否。

现在,当您将变量传递给函数时,它会尝试将某些内容写入其地址包含在result变量中的位置。但它不是有用的东西,你会尝试访问一些甚至不适合你的内存。(不允许)。

段错误是由程序尝试读取或写入非法内存位置引起的。

这就是你的情况。

是否意味着内存溢出?

没有。它与溢出无关。

您的代码中state的目的是什么?您没有在代码中的任何位置使用它。你可以避免它。

答案 1 :(得分:1)

//char * result; // this is just a pointer with no memory to point to
char result[256] = {0,}; // now this will work
strftime(result, 20, "%Y:%m:%d %H:%M:%S", currTime);//E.g. 2017:11:12 12:30:48 Max is 20 characters including \0

替代地

//char * result; // this is just a pointer with no memory to point to
char *result = malloc( 256 * sizeof(char));
if( result ) 
{
    strftime(result, 20, "%Y:%m:%d %H:%M:%S", currTime);//E.g. 2017:11:12 12:30:48 Max is 20 characters including \0
}