首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >分段故障GetConsoleScreenBufferInfo (WinApi) C++

分段故障GetConsoleScreenBufferInfo (WinApi) C++
EN

Stack Overflow用户
提问于 2014-07-16 17:54:32
回答 1查看 816关注 0票数 0

我正在使用WinApi在C++中更改控制台属性,并在最后两个函数中调用GetConsoleScreenBufferInfo()时获得分段错误错误。

奇怪的是,如果我使用相同的句柄声明和PCONSOLE_SCREEN_ -just _INFO-在main()中复制调用GetConsoleScreenBufferInfo()的同一段代码,我不会得到错误,但是如果在getPosCursorX()中这样做,我仍然会得到错误。

名称空间consola{

代码语言:javascript
运行
复制
HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
PCONSOLE_SCREEN_BUFFER_INFO infoCon;

struct TamanoConsola
{
    COORD buffer;
    SMALL_RECT ventana;
} inicial;

void gotoxy(int x, int y)
{
    COORD dwPos;
    dwPos.X=x;
    dwPos.Y=y;

    SetConsoleCursorPosition(hCon, dwPos);
}

void setColor(int texto, int fondo)
{
    SetConsoleTextAttribute(hCon, fondo*16+texto);
}

void setBufferTamano(int ancho, int alto)
{
    COORD buffertamano = {ancho, alto};

    if(SetConsoleScreenBufferSize(hCon, buffertamano) == 0)
        std::cout << "ERROR de WinApi numero: " << GetLastError() << std::endl;
}

void setVentanaTamano(int ancho, int alto)
{
    SMALL_RECT ventanatamano1 ={0, 0, ancho-1, alto-1};
    SMALL_RECT* ventanatamano = &ventanatamano1;

    if(SetConsoleWindowInfo(hCon, TRUE, ventanatamano) == 0)
        std::cout << "ERROR de WinApi numero: " << GetLastError() << std::endl;
}

void setVentanaBufferTamano(int anchoVentana, int altoVentana, int anchoBuffer, int altoBuffer)
{
    setBufferTamano(anchoBuffer, altoBuffer);
    setVentanaTamano(anchoVentana, altoVentana);
}

int getPosCursorX()
{
    GetConsoleScreenBufferInfo(hCon, infoCon);

    return infoCon->dwCursorPosition.X;
}

int getPosCursorY()
{
    GetConsoleScreenBufferInfo(hCon, infoCon);

    return infoCon->dwCursorPosition.Y;
}

}

提前感谢!

EN

Stack Overflow用户

回答已采纳

发布于 2014-07-16 18:01:58

要解决这个问题,不要将infoCon声明为指向CONSOLE_SCREEN_BUFFER_INFO的指针(前缀P意味着它是一个指针),而是将其声明为实际结构:

代码语言:javascript
运行
复制
CONSOLE_SCREEN_BUFFER_INFO infoCon;

然后,当您需要指向它的指针时,使用address-of操作符&

代码语言:javascript
运行
复制
GetConsoleScreenBufferInfo(hCon, &infoCon);

要解释更多,当您声明全局变量时,编译器运行时系统会自动将它们初始化为零。为零的指针与NULL指针相同。删除NULL指针会导致http://en.wikipedia.org/wiki/Undefined_behavior,在许多情况下会导致崩溃。

关于未定义的行为,需要了解的一件重要的事情是,有时它似乎是可行的。有时它似乎完美无缺地工作,有时它似乎有效,但却产生了意想不到的结果,但正如我之前所说的,大多数情况下,程序只是崩溃。

关于变量的初始化。局部变量(非静态)根本不初始化。使用未初始化的局部变量也是未定义的行为,未初始化的局部变量的值是不确定的。如果你检查它,它看起来是随机的。实际上,当所有C编译器将局部变量放在堆栈上时,该值将是变量所在位置的内存中的值。与全局变量一样,未初始化的本地静态变量初始化为零。

票数 5
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24787537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档