这个指向结构类型转换的void指针有什么问题?



这里的任务是指出这个代码片段中的所有错误。我不知道代码是用C还是c++呈现的,所以这两种假设都是有效和有用的。

struct MyStructData
{
VOID* pPtr;
UINT32 flags;
}
VOID main()
{
MyStructData* pMyStructData = InitFunction();
// work done here
DeInitFunction(pMyStructData);
}
MyStructData* InitFunction()
{
MyStructData* pMyStructData = malloc(sizeof(MyStructData));
pMyStructData->pPtr         = malloc(1024);
return pMyStructData;
}
VOID DeInitFunction(MyStructData* pMyStructData)
{
free(pMyStructData);
}

我看到void指针被声明了,然后在InitFunction中,pMyStructData有与MyStructData结构体大小相同的malloc。接下来访问pPtr成员并malloc-ed一个大块(1024)…这就是我看到的问题所在。由于pPtr成员被声明为void,pMyStructData太小而不能分配1024字节?

请帮助我了解这里发生了什么,以及我错过了什么。

在语言标签从C变为c++之前给出答案。

struct MyStructData
{
VOID* pPtr;
UINT32 flags;
}
在C语言中没有VOIDUINT32

类型,除非你包含一些提供它们的头文件。也许是一些Windows的东西?在该结构体声明之后也缺少;。(感谢wildplasser)

VOID main()

main的有效签名为int main(void)int main (int argc, char *argv[])或兼容。

{
MyStructData* pMyStructData = InitFunction();

没有类型MyStructData。使用struct MyStructData或添加typedef

您没有提供InitFunction()的原型。

// work done here
DeInitFunction(pMyStructData);
}

同样:没有DeInitFunction的原型

MyStructData* InitFunction()
{
MyStructData* pMyStructData = malloc(sizeof(MyStructData));

再次使用struct MyStructData.

使用malloc没有原型。


pMyStructData->pPtr         = malloc(1024);

基本有效(除了缺少原型),但在解引用之前,您应该检查pMyStructData是否为NULL


return pMyStructData;
}
VOID DeInitFunction(MyStructData* pMyStructData)
{
free(pMyStructData);
}

正如Johnny Mopp所提到的,pMyStructData->pPtr没有被释放,导致内存泄漏。

Again: No typeVOIDandMyStructData.

再次:使用函数(free)没有原型。

现在关于你的发现:

我看到void指针被声明,然后在InitFunction中,pMyStructData有MyStructData.

除了我上面提到的问题之外,这很好。这就是为结构体分配内存的方式。

接下来访问pPtr成员并malloc-ed一个大块(1024)…这这就是我看到的问题所在。由于pPtr成员被宣布为无效,pMyStructData太小,不能分配1024字节?

那不是问题。成员ptr指向malloc提供的内存,与指针本身所在的结构体没有关系。它不需要适合结构体。在此之前,您只应该检查NULL

相关内容

  • 没有找到相关文章

最新更新