这个指向 struct cast 的 void 指针有什么问题?

时间:2021-02-19 18:14:53

标签: c++ c

这里的任务是指出这个片段的所有错误。我不知道代码是以 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 具有 malloc,其结构体的大小为 MyStructData。接下来,访问 pPtr 成员并对其进行 malloc-ed 一个大块 (1024)……这是我看到的问题所在。由于 pPtr 成员被声明为 void,pMyStructData 是否太小而无法分配 1024 个字节?

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

1 个答案:

答案 0 :(得分:2)

在语言标记从 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 没有被释放会导致内存泄漏。

再次:没有输入 VOIDMyStructData

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

现在关于您的发现:

<块引用>

我看到声明了void指针,然后在InitFunction中,pMyStructData有 malloc 与结构 MyStructData 的大小。

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

<块引用>

接下来访问 pPtr 成员并对其进行 malloc-ed 一个大块 (1024)...这个 是我看到问题的地方。由于 pPtr 成员被声明为无效, pMyStructData 太小,无法分配 1024 字节?

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