c++ - 如何在驱动程序代码中检查 unsigned char 指针是否为零?

标签 c++ memory-management driver

我写了一个查询包的驱动代码。但是我遇到了蓝屏问题,我也转储了。分析后,我在下面提到的特定行上出错。为什么会出现这个错误?我可以用零检查 unsigned char 指针 吗?

我的定义:

typedef unsigned char u8_t ;
typedef unsigned char s8_t ;
typedef unsigned short u16_t ;

我的功能

void function1 (u8_t ntype , u16_t nvar , u8_t *pbuffer)
{
   HEADER packet = (HEADER)allocatemry( sizeof(HEADER) + (pbuffer == 0 ? 0 : var)) ;  //header is a structure with contain union . 

   packet->type = ntype ; 

   if ( pbuffer != 0 )  //got bluescreen issue . windbug pointed here 
    {
      packet->variant.variable = network(nvar) ;
    }

   else
    {
       packet->variant.variable = nvar ;
    }
}

请帮帮我。

最佳答案

错误不太可能发生在显示的行上。它之前或之后的那一行似乎更有可能。

问题的根源是这样的:

HEADER packet = (HEADER)allocatemry( sizeof(HEADER) + (pbuffer == 0 ? 0 : var)) ; //header is a structure with contain union .

与声明行末尾的评论不同,HEADER实际上必须是指针而不是结构。它是分配函数的返回类型和此处的间接运算符证明了这一点:packet->type .

所以,自 HEADER是一个指针,您正在为单个指针分配足够的内存,并可能根据 pbuffer 分配更多字节。和 var而不是为某种对象分配足够的字节。如果这对于您的对象来说内存不足,那么当程序假设分配了足够的内存时,这将导致无效的内存访问。

您可以获得存储 HEADER 指向的对象所需的字节数像这样:sizeof std::remove_pointer<HEADER>::type .

现在您已经在注释中显示了结构的实际类型,这是一种更简单的方法:sizeof _MYHEADER .

顺便说一句,以下划线开头后跟大写字母的标识符是保留的,所以 _MYHEADER不允许。我建议完全摆脱 typedef,将结构命名为 MYHEADER并使用 MYHEADER*以获得避免将来混淆的指示。

关于c++ - 如何在驱动程序代码中检查 unsigned char 指针是否为零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32995619/

相关文章:

windows - 以编程方式捕捉到扬声器的声音的最佳向后兼容方式

linux - Linux (Ubuntu) 中的监视器详细信息

linux - Linux USB 批量传输内核驱动程序和硬件环回的性能非常差(~0.4MB/s)

c++ - 递增解引用迭代器

python - 如何在python中实现CRTP功能?

c++ - OpenCV 3 KNN 实现

c++ - 是否可以到处替换全局 "operator new()"?

c++ - 是否可以限制模板?

python - 了解 scikit 学习预测的随机森林内存要求

iPhone内存管理问题: retaining iterated UITableViewCells?