C Visual studio“;取消引用空指针“;警告

C Visual studio“;取消引用空指针“;警告,c,memory,sal,C,Memory,Sal,我有一个函数,它创建一个地址,在该地址连续存储值,然后返回地址: 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 *

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

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;
}
但是,我收到一条警告,指出
警告C6011取消引用空指针'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
可能会在分配失败时返回
NULL

它实际上是应用于库标题的注释发出的警告,而不是VisualStudio本身。您应该始终检查
malloc
返回值的
NULL
并对其进行处理,因为
malloc
如果失败,可能会返回
NULL
。我通常的方法是:

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

   use(space);

cleanup:
   free(space);
   space = NULL;

阅读:此警告表示您的代码取消引用了一个可能为空的指针。那么,这就解决了它。我可能应该先看一下文件。无论如何谢谢你@SeanXie“警告是否真的意味着solAddr可能为空”是的,这就是表示失败的方式。如果您的“文本声明其他”,则该文本不完整或完全错误。