通过指针访问struct成员

时间:2014-10-19 10:03:17

标签: c pointers struct

我有一个多实例对话框,其HWND和DC包含在结构向量中。在我调用CreateWindowEx()之前,我为结构的一个新实例分配内存,并将其指针传递给WndProc(带lpParam)。

在WndProc中我有以下代码:

HexParams Hex;
HexParams *pHex;
if (uMsg == WM_NCCREATE) {
    SetWindowLongPtr(hDlg, GWLP_USERDATA, (LONG_PTR) ((CREATESTRUCT *)lParam)->lpCreateParams);
    return TRUE;
} else {
    LONG_PTR lpUserData = GetWindowLongPtr(hDlg, GWLP_USERDATA);
    if (lpUserData) {
        pHex = (HexParams *)lpUserData;
        Hex = *pHex;
    } else
        return DefWindowProc(hDlg, uMsg, wParam, lParam);
}

然后在整个WndProc中,我一直在使用Hex.Member来访问它的memebrs,从它们读取并写入它们(如果它是单个实例并且结构是全局的话)。因此,当我添加多实例支持时,我希望简单地解除引用指针会从该向量中给出结构memebrs。

但是,以下示例执行不同的操作:

Hex.DC = GetDC(hDlg);
pHex->DC = GetDC(hDlg);

尽管之前做过Hex = *pHex;pHex->DC写入我的vector元素,但是Hex.DC写到某个我无法弄清楚的地方。有没有办法在代码中保留Hex.Member用法,或者我必须将它们全部转换为pHex->Member

我可能“错过了指针”,但我无法在这里正确使用它们。

1 个答案:

答案 0 :(得分:2)

Hex是该函数中定义的变量。写Hex.DC将在该函数调用的堆栈中引用该结构中的4个字节。

pHex指向调用者确定的某个地方。 Hex = *pHex;会将到达结构的内容复制到您的本地结构中。它们是不同的记忆块。

绘制堆栈图片,阻止呼叫的激活帧,在那里填写Hex。绘制分配内存的其他块(全局,动态,早期调用),并向它们绘制箭头以指示指针。