当前位置:  开发笔记 > 编程语言 > 正文

char*函数在C中无法正确显示

如何解决《char*函数在C中无法正确显示》经验,为你挑选了1个好方法。

你正在返回一个指向局部变量('缓冲区')的指针,这是无效的,我很惊讶你没有收到关于它的警告.

当函数退出时,所有局部变量都不再存在(称为超出范围),并且它们的内存将用于其他目的.你正在返回一个指向这个记忆的指针,但不能保证现在会有什么.

在这种情况下,似乎在printf调用时,内存包含一个被视为空字符串的0.这实际上是非常幸运的,你很容易最终得到垃圾打印或程序崩溃.

要解决此问题,您可以将缓冲区传递给czas,或者让czas在堆上分配一个缓冲区,稍后您将释放该缓冲区.我会推荐前者,因为它与几乎所有库函数的工作方式一致.它还避免了调用者必须稍后释放指针的内存分配.

例如:

size_t czas(char* buffer, size_t buffer_size)
{
    time_t rawtime;
    struct tm * timeinfo;

    time ( &rawtime );
    timeinfo = localtime ( &rawtime );
    return strftime (buffer, buffer_size,"Now it's %I:%M%p.",timeinfo);
}

int main()
{
    char buffer [80];
    if (czas(buffer, 80))
    {
      printf("%s\n",buffer);
    }
    else
    {
      printf("Call to czas failed");
    }
    system("PAUSE");
}

更新:我没有注意到strftime采用了一个大小参数,我已经更新了代码以使用它并正确地从strftime传回结果.因此,这更加强大,您不会意外地溢出缓冲区.



1> Andrew Grant..:

你正在返回一个指向局部变量('缓冲区')的指针,这是无效的,我很惊讶你没有收到关于它的警告.

当函数退出时,所有局部变量都不再存在(称为超出范围),并且它们的内存将用于其他目的.你正在返回一个指向这个记忆的指针,但不能保证现在会有什么.

在这种情况下,似乎在printf调用时,内存包含一个被视为空字符串的0.这实际上是非常幸运的,你很容易最终得到垃圾打印或程序崩溃.

要解决此问题,您可以将缓冲区传递给czas,或者让czas在堆上分配一个缓冲区,稍后您将释放该缓冲区.我会推荐前者,因为它与几乎所有库函数的工作方式一致.它还避免了调用者必须稍后释放指针的内存分配.

例如:

size_t czas(char* buffer, size_t buffer_size)
{
    time_t rawtime;
    struct tm * timeinfo;

    time ( &rawtime );
    timeinfo = localtime ( &rawtime );
    return strftime (buffer, buffer_size,"Now it's %I:%M%p.",timeinfo);
}

int main()
{
    char buffer [80];
    if (czas(buffer, 80))
    {
      printf("%s\n",buffer);
    }
    else
    {
      printf("Call to czas failed");
    }
    system("PAUSE");
}

更新:我没有注意到strftime采用了一个大小参数,我已经更新了代码以使用它并正确地从strftime传回结果.因此,这更加强大,您不会意外地溢出缓冲区.

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有