Visual studio "Dereferencing NULL pointer" 警告

Visual studio "Dereferencing NULL pointer" warning

我有一个函数可以创建一个地址,在该地址连续存储值,然后 returns 地址:

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'。经过一些在线搜索后,我发现我只需要使用“if”语句确保 solAddr 不是 NULL 并且警告消失:

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 检查的情况下都有效,但我很困惑这个警告到底想告诉我什么。

是的,那个警告是因为 malloc 可以 return NULL 如果分配失败。

这实际上是来自 SAL 应用于库 headers 的注释的警告,而不是 Visual Studio 本身。您应该始终检查 malloc return 的 NULL 值并处理它,因为 malloc 可以 return NULL 如果失败。我常用的方法是:

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

   use(space);

cleanup:
   free(space);
   space = NULL;