我有一个函数,该函数创建一个地址,将值连续存储在该地址,然后返回该地址:
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检查和不检查时都可以工作,但是我不知道这个警告到底想告诉我什么。
发布于 2021-02-08 22:55:20
是的,这个警告是存在的,因为如果分配失败,malloc可以返回NULL。
它实际上是应用于库头的销售注释的警告,而不是Visual本身。您应该始终检查malloc返回值的NULL并处理它,因为如果NULL失败,malloc可以返回NULL。我通常的方法是:
space = malloc(SIZE);
if(NULL == space)
{
goto cleanup;
}
use(space);
cleanup:
free(space);
space = NULL;https://stackoverflow.com/questions/66110509
复制相似问题