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有些过分,但值得一提。