操作PCONSOLE_CURSOR_INFO触发0xC0000005安全错误问题咨询
错误原因
错误码0xC0000005为内存访问违例,和安全权限、SECURITY_DESCRIPTOR配置没有关系,问题出在API参数类型使用错误:
PCONSOLE_CURSOR_INFO是Windows API预定义的指针类型,等价于CONSOLE_CURSOR_INFO*,声明该类型变量时得到的是一个结构体指针,而非结构体实例- 代码中将这个指针初始化为
NULL后,又传入指针的地址&lpConsoleCursorInfo(二级指针类型CONSOLE_CURSOR_INFO**),和GetConsoleCursorInfo要求的CONSOLE_CURSOR_INFO*参数类型不匹配,函数写入非法内存地址直接触发崩溃。
正确实现
以下是可直接运行的完整代码,同时实现指定位置输出、隐藏控制台光标两个需求:
#include <windows.h> #include <stdio.h> int main() { HANDLE hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE); if (hConsoleOut == INVALID_HANDLE_VALUE) { printf("Get console handle failed\n"); return 1; } // 直接声明CONSOLE_CURSOR_INFO结构体实例,不要用指针类型声明变量 CONSOLE_CURSOR_INFO cursorInfo; if (!GetConsoleCursorInfo(hConsoleOut, &cursorInfo)) { printf("Get cursor info failed\n"); return 1; } // 配置隐藏光标 cursorInfo.bVisible = FALSE; cursorInfo.dwSize = 1; SetConsoleCursorInfo(hConsoleOut, &cursorInfo); // 指定控制台坐标输出:X为列数,Y为行数,坐标原点(0,0)在控制台左上角 COORD targetPos = {10, 5}; SetConsoleCursorPosition(hConsoleOut, targetPos); printf("Content printed at position (10,5) with cursor hidden"); return 0; }
补充说明
- 控制台默认创建的
STD_OUTPUT_HANDLE自带光标配置、光标移动的操作权限,不需要额外修改安全描述符 - 隐藏光标的核心配置是
CONSOLE_CURSOR_INFO结构体的bVisible成员,赋值为FALSE即可生效 - 后续如果需要恢复光标,重新调用
SetConsoleCursorInfo将bVisible设为TRUE即可 - 指定位置输出通过
SetConsoleCursorPosition接口实现,传入COORD类型的坐标值即可移动输出光标到目标位置。
内容的提问来源于stack exchange,提问作者starchild
相关产品推荐
相关产品推荐

