0

我有一个创建地址的函数,将值连续存储在该地址,然后返回该地址:

double* quadratic(double a, double b, double c)
{
    double* solAddr = malloc((size_t)(2 * sizeof(double)));

    *(solAddr) = (-b + sqrt(b * b - 4.0 * a * c)) / 2.0 * a;
    *(solAddr + 1) = (-b - sqrt(b * b - 4.0 * a * c)) / 2.0 * a;

    return solAddr;
}

但是,我收到一条警告,指出Warning C6011 Dereferencing NULL pointer 'solAddr'. 经过一些在线搜索,我发现我只需要确保solAddr不是NULL带有“if”-语句并且警告消失了:

double* quadratic(double a, double b, double c)
{
    double* solAddr = malloc((size_t)(2 * sizeof(double)));

    if (solAddr != NULL)
    {
        *(solAddr) = (-b + sqrt(b * b - 4.0 * a * c)) / 2.0 * a;
        *(solAddr + 1) = (-b - sqrt(b * b - 4.0 * a * c)) / 2.0 * a;
    }

    return solAddr;
}

警告真的意味着solAddr 可能NULL吗?文本似乎另有说明。该代码在有和没有NULL检查的情况下都有效,但我对这个警告真正试图告诉我的内容感到困惑。

4

1 回答 1

1

是的,该警告存在,因为如果分配失败malloc可能会返回。NULL

这实际上是来自应用到库头文件的SAL注释的警告,而不是 Visual Studio 本身。您应该始终检查并处理它malloc的返回值,因为如果失败可能会返回。我常用的方法是:NULLmalloc NULL

   space = malloc(SIZE);
   if(NULL == space)
   {
       goto cleanup;
   }

   use(space);

cleanup:
   free(space);
   space = NULL;
于 2021-02-08T22:55:20.127 回答