You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

操作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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 12:57:12