我有一个函数,它创建一个地址,在地址上连续存储值,然后返回地址:
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
不是带有“if”- 语句的 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
检查时都适用,但我对这个警告真正想告诉我的内容感到困惑。
答案 0 :(得分:1)
是的,存在该警告是因为如果分配失败,malloc
可能会返回 NULL
。
这实际上是来自应用于库标头的 SAL 批注的警告,而不是 Visual Studio 本身。您应该始终检查 malloc
的 NULL
返回值并处理它,因为 malloc
可能 如果失败则返回 NULL
。我常用的方法是:
space = malloc(SIZE);
if(NULL == space)
{
goto cleanup;
}
use(space);
cleanup:
free(space);
space = NULL;