申请结构体空间中的一个问题

发布于 2022-10-15 08:06:13 字数 1264 浏览 20 评论 0

long setString(char * str)
{
        MessageBox(NULL,str,"setString",0);
        return(0);
};
long getString(char *str,long length)
{
        return 0;
}

typedef long setStringStr(char *);
typedef long getStringStr(char *,long);

typedef struct{
    setStringStr *setString;
        getStringStr *getString;
}IExampleVtbl;
typedef struct {
    IExampleVtbl *lpVtbl;
        int count;
        char buffer[80];
} IExample;

   IExample * example;
  example=(IExample *)GlobalAlloc(GMEM_FIXED,sizeof(IExample)+sizeof(IExampleVtbl *));
example->lpVtbl->setString=setString;
example->lpVtbl->getString=getString;
example->lpVtbl->setString("setString");

红色代码中如果去掉sizeof(IExampleVtbl *)后,编译,运行出现错误:"0x00401122"指令引用的"0x00000000"内存,该内存不能为"written"
不明白为什么还要加上sizeof(IExampleVtbl *),难道sizeof(IExample)不包含sizeof(IExampleVtbl *)的空间大小吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

素年丶 2022-10-22 08:06:13
  1. example = (IExample *) GlobalAlloc(GMEM_FIXED, sizeof(IExample) + sizeof(IExampleVtbl *));
  2. example = (IExample *) GlobalAlloc(GMEM_FIXED, sizeof(IExample));

复制代码这两种写法都是错误的!

你应该:

  1. example = (IExample *) GlobalAlloc(GMEM_FIXED, sizeof(IExample));
  2. example->lpVtbl = (IExampleVtbl *) GlobalAlloc(GMEM_FIXED, sizeof(IExampleVtbl));

复制代码最基本的内存分配概念了。。

孤蝉 2022-10-22 08:06:13

2楼正解。
LZ那样的分配,只不过是多分配了四个字节的空间供example操作,至于example->lpVtbl是个完全没有初始化的指针。

痴意少年 2022-10-22 08:06:13

回复 2# 雨过白鹭洲

谢谢回复!
还有一点不明白:
(IExampleVtbl *) GlobalAlloc(GMEM_FIXED, sizeof(IExampleVtbl));是如何分配内存(如何布局的)?

回首观望 2022-10-22 08:06:13

带*和不带*是不一样的

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文