C 语句在main中运行,但从函数调用时不运行
对不起。我真的试图自己解决这个问题。但我不明白。当我将语句放在C 语句在main中运行,但从函数调用时不运行,c,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
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;
}
在
result
中分配内存,这就是导致问题的原因
在你的情况下是这样的
result = malloc(sizeof(char)*BUFFSIZE);
if( result == NULL ){
fprintf(stderr,"Error");
exit(1);
}
必须对分配的内存进行相应的free
调用,这里就是
result = malloc(sizeof(char)*BUFFSIZE);
if( result == NULL ){
fprintf(stderr,"Error");
exit(1);
}
免费(结果)代码>
访问未初始化的变量也是未定义的行为
同样,如果没有malloc
,您也可以简单地执行此操作
char result[20];
strftime(result,20, "%Y:%m:%d %H:%M:%S", currTime);
此外,我先前使用状态
进行编辑也是不可能的。(没有注意到它是文本字符串)因为字符串文本属于内存的只读部分。现在我们正在尝试编辑或修改它。这是错误的
第二,即使它不是只读的,它仍然没有内存来保存您要写的字符。因为尺寸不够大
进一步解释
要澄清问题,请查看结果
变量。它是类型char*
。它应该包含char变量的地址。现在你申报的时候。然后它包含一个不确定的值
它指向什么有意义的东西吗?没有
现在,当您将变量传递给函数时,它会尝试向地址包含在result
variable中的位置写入内容。但这不是什么有用的东西,你会试图访问一些甚至不是为你准备的记忆。(不允许)
SEGFULTS是由于程序试图读取或写入非法内存位置而导致的
你的情况就是这样
这是否意味着内存溢出?
不,这与溢出无关
另外,代码中的状态
的目的是什么?您没有在代码中的任何地方使用它。您可以避免它。在result
中分配内存,这就是导致问题的原因
//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
在你的情况下是这样的
result = malloc(sizeof(char)*BUFFSIZE);
if( result == NULL ){
fprintf(stderr,"Error");
exit(1);
}
必须对分配的内存进行相应的free
调用,这里就是
result = malloc(sizeof(char)*BUFFSIZE);
if( result == NULL ){
fprintf(stderr,"Error");
exit(1);
}
免费(结果)代码>
访问未初始化的变量也是未定义的行为
同样,如果没有malloc
,您也可以简单地执行此操作
char result[20];
strftime(result,20, "%Y:%m:%d %H:%M:%S", currTime);
此外,我先前使用状态
进行编辑也是不可能的。(没有注意到它是文本字符串)因为字符串文本属于内存的只读部分。现在我们正在尝试编辑或修改它。这是错误的
第二,即使它不是只读的,它仍然没有内存来保存您要写的字符。因为尺寸不够大
进一步解释
要澄清问题,请查看结果
变量。它是类型char*
。它应该包含char变量的地址。现在你申报的时候。然后它包含一个不确定的值
它指向什么有意义的东西吗?没有
现在,当您将变量传递给函数时,它会尝试向地址包含在result
variable中的位置写入内容。但这不是什么有用的东西,你会试图访问一些甚至不是为你准备的记忆。(不允许)
SEGFULTS是由于程序试图读取或写入非法内存位置而导致的
你的情况就是这样
这是否意味着内存溢出?
不,这与溢出无关
另外,代码中的状态
的目的是什么?您没有在代码中的任何地方使用它。你可以避免
//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
}
或者
//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
}
很抱歉我是C语言的新手。你能解释一下为什么我需要在方法中为结果分配内存,而不是在main中吗?@Anlinyang。;在这两种情况下。你不能传递一个空的char*
你需要分配内存,否则你认为字符将被写入哪里。这就是为什么。所以每次我对字符串使用char*时,我都需要从堆中为它分配内存?但总的来说,编译器是为你做的?@Anlinyang.:是的,你需要内存的地方..是的。malloc
在这方面做得太过分了,特别是考虑到静态缓冲区已经在那里可供使用。对不起。我是C语言的新手。你能解释一下为什么我需要在方法中为结果分配内存,而不是在main中吗?@Anlinyang。;在这两种情况下。你不能传递一个空的char*
你需要分配内存,否则你认为字符将被写入哪里。这就是为什么。所以每次我对字符串使用char*时,我都需要从堆中为它分配内存?但总的来说,编译器是为你做的?@Anlinyang.:在需要内存的地方是的..是的。malloc
在这方面做得太过分了,特别是考虑到静态缓冲区已经在那里可供使用。作为一般规则,这里跳出的代码气味#1是你传入但从不使用的参数。作为一般规则,这里跳出的代码气味#1是您传入但从未使用的参数。我认为它会导致缓冲区溢出更多,不管怎样,它将处于只读状态。您是对的。现在投票了。malloc是一种过度杀伤力,但值得一提。我认为它会导致缓冲区溢出更多,不管怎样,它将处于只读状态。你是对的。现在投票了。malloc有些过分,但值得一提。