我写了一个查询包的驱动代码。但是我遇到了蓝屏问题,我也转储了。分析后,我在下面提到的特定行上出错。为什么会出现这个错误?我可以用零检查 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/