添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

关于分配动态内存编译器警告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>