查找C函数中的错误

查找C函数中的错误,c,C,此函数用于将布尔值转换为字符串。 指出可能的运行时错误 #define TRUE 1 #define FALSE 0 char* bool2Str(boolean x) { char result[5]; if (x == TRUE) strcpy(result, "TRUE"); if (FALSE == x) strcpy(result, "FALSE"); return &(result[0]); } 缓冲区溢出:“FALSE”是6个字节,包括空终止符,strcpy将

此函数用于将布尔值转换为字符串。 指出可能的运行时错误

#define TRUE  1
#define FALSE 0

char* bool2Str(boolean x)
{
char result[5];

if (x == TRUE)
strcpy(result, "TRUE");

if (FALSE == x) 
strcpy(result, "FALSE");

return &(result[0]);
}
  • 缓冲区溢出:“FALSE”是6个字节,包括空终止符,
    strcpy
    将尽职尽责地写入,但只有5个字节的空间
  • 通过函数的address返回一个本地临时变量,使得返回的值不可用(我想测试NULL时除外)
  • 0或1以外的值根本不会写入任何内容。与其他两个bug相比,这就相形见绌了
  • 数组结果的大小太短-应至少为6
  • 数组不应是堆栈数组。它需要是静态数组或动态分配的数组
  • 没有布尔类型是C。这是typedef吗

  • 如果调用方使用不同的布尔值调用此函数两次,第二次调用将覆盖第一次调用的结果,因为它是相同的变量(如果是静态的)

    但是,该变量结果不是静态的,因此被调用方尝试返回一个指针,该指针指向将超出nanosec范围的局部变量,这通常是运行时错误/bug的良好来源


    另外,如果我是对的(不是C专家…),
    strcpy(result,“FALSE”)
    将六个字节复制到
    result
    ,而
    result
    只能保存五个元素(索引为0到4)。

    这里给其中一个提示:一个包含五个字符的字符串到底有多长?你最终解决了吗?实际上它不属于这里,因为毫无疑问。。。首先,ANSI-C中没有布尔值,其次,当将“FALSE”复制到缓冲区时,缓冲区会溢出,从堆栈指定的变量返回指针是致命的!Offtopic:jobs的定义标记:作业是在后台执行的进程,或计划稍后执行的进程。它要么是Offtopic,要么应该删除jobs标记。就是这样。所以这不再是离题了。现在少了一个问句。可以不管怎样,这都在课文中。你们为什么要结束这个问题?仅仅是因为形式上的原因?只是问一下……而且,直截了当而又丑陋的事实是:如果你自己不能回答这个问题,你就没有希望管理一个C程序员的工作。你第一天上班就会被开除。