编写窗口创建代码触发Access violation写入错误的求助
问题分析与解决
核心错误点
- 函数调用无效:你在
Prepare_Screen里写的MakeBitMap不是合法的函数调用——既没有加括号,也没传入要求的DWORD**类型参数,等于完全没执行这个函数的逻辑。 - 空指针写入:崩溃提示
Access violation writing location 0x0000000000000000,说明ws_cpy是未初始化的空指针。你直接给它的第一个元素赋值,等于尝试写入系统保护的无效内存地址0,触发了访问违例。
修正方案
第一步:修复ws_cpy的内存分配
如果ws_cpy是全局或局部指针,必须先为它分配合法的内存空间,示例如下:
#include <stdlib.h> // 包含malloc所需的头文件 DWORD* ws_cpy; // 假设是全局指针 void MakeBitMap(DWORD** window_p) { // 分配至少1个DWORD大小的内存 ws_cpy = (DWORD*)malloc(sizeof(DWORD)); if (ws_cpy == NULL) { // 处理内存分配失败的情况,比如直接返回 return; } ws_cpy[0] = 0x0000aaff; }
第二步:修复函数调用逻辑
在Prepare_Screen里正确调用MakeBitMap,传递符合参数类型要求的值:
void Prepare_Screen(HWND hWnd){ DWORD* screen_ptr = NULL; // 传递指针的地址,满足DWORD**的参数类型要求 MakeBitMap(&screen_ptr); }
额外说明
你提到以为只有window_p被解引用,但当前代码里MakeBitMap根本没用到这个参数,它目前是多余的。如果你的原本逻辑是让调用方通过window_p拿到ws_cpy的地址,可以在函数里加上*window_p = ws_cpy;,这样调用后screen_ptr就会指向分配好的内存。
内容的提问来源于stack exchange,提问作者Dom Da Bomb
相关产品推荐
相关产品推荐

