对不起。我真的试着自己解决这个问题。但我不明白。当我将它们放在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;
}
答案 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
}