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;
我有一个函数可以创建一个地址,在该地址连续存储值,然后 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;