关于分配动态内存编译器警告C6001和C6011
0x00
在做数据结构与算法的二叉树实验时,要在非递归计算度为1的节点的函数里用到一个结构体。
0x01
一开始我的做法是直接声明了一个结构体指针实例BiTree x;
发现编译器警告C6001:
使用未初始化的内存
查看Microsoft的官方文档
当在分配值之前使用未初始化的局部变量时,将报告此警告。 这种用法可能会导致不可预知的结果。 在使用变量之前,始终应初始化变量。
于是我以为是需要在声明时将指针初始化为空指针,于是做了如下修改
BiTree x = NULL;
0x02
但是修改之后遇到了两种情况,一种是编译器警告使用未初始化的内存:
取消引用 NULL 指针
一种是编译器未给出任何报错
0x03
想了半天我突然想起来好像得给指针分配动态内存才能解决问题
于是进行了如下修改
BiTree x = (BiTree)malloc(sizeof(BiTNode))
然而报错仍然存在
整不会了......
0x04
于是我再次查看Microsoft的帮助文档
此警告指示代码取消引用潜在的 null 指针。 如果该指针的值无效,则结果是未定义的。 若要解决此问题,请在使用前验证指针。
并且在下方还有官方给出的demo
以下代码生成此警告,因为如果内存不足,则
malloc
调用可能会返回 null:
#include <malloc.h>
void f( )
char *p = ( char * ) malloc( 10 );
*p = '\0';
// code ...
free( p );
若要更正此警告,请检查指针以获取 null 值,如以下代码所示:
#include <malloc.h>
void f( )
char *p = ( char * )malloc ( 10 );
if ( p )
*p = '\0';
// code ...
free( p );
函数可能使用
Pre
条件中的
Null
属性来注释参数。 取消引用参数之前,在这些函数中分配内存。 以下代码生成警告 C6011,因为尝试取消引用函数内的 null 指针 (
pc
),而无需首先分配内存:
#include <sal.h>