char *localized_time(char *filename)
{
struct tm *tm_ptr;
struct stat stat_block;
char buffer[120];
stat (filename, &stat_block);
tm_ptr = localtime(&stat_block.st_mtime);
strftime(buffer, sizeof(buffer),"%a %b %e %T %Y", tm_ptr);
return buffer;
}
上面这段代码是有错误的,问题就出在函数最后一行,也就是返回buffer的那一行。buffer是一个自动分配内存的数组。是该函数的局部变量。当控制流离开声明自动变量的范围时,自动变量失效。这就意味着即使返回一个指向局部变量的指针,当函数结束时,由于改变量已经被销毁,谁也不知道这个指针指向的地址内容是什么。
在C语言中,自动变量在堆栈中分配内存,当包含自动变量的函数或代码块退出时,他们所占用的内存便被回收,他们的内容肯定会被下一个所调用的函数覆盖。
这种问题会导致难以预料的灾难问题且难以排查。
解决办法:
1.返回一个指向字符串常量的指针
2. 使用全局声明的数组
3.使用静态数组
4.显示的分配一些内存,保存返回的值
5.要求调用者分配内存来保存函数的返回值