C ++: странная ошибка сегментации - PullRequest
2 голосов
/ 10 июня 2010

Я пытаюсь что-то напечатать, используя C ++.Тем не менее, я сталкиваюсь со странной ошибкой, из-за которой я ничего не понял, я использую следующий код:

PRINTDLG pd;
ZeroMemory(&pd, sizeof(pd));
pd.lStructSize = sizeof(pd);
pd.Flags = PD_RETURNDEFAULT;
PrintDlg(&pd);

// Set landscape
DEVMODE* pDevMode = (DEVMODE*)GlobalLock(pd.hDevMode);
pDevMode->dmOrientation = DMORIENT_LANDSCAPE;
pd.hwndOwner = mainWindow;
pd.Flags = PD_RETURNDC | PD_NOSELECTION;
GlobalUnlock(pd.hDevMode);

if (PrintDlg(&pd))
{
    DOCINFO di;

    di.cbSize       = sizeof(DOCINFO);
    di.lpszDocName  = "Test Print";
    di.lpszOutput   = (LPTSTR)NULL;
    di.fwType       = 0;

    //start printing
    StartDoc(pd.hDC, &di);

    int a;
    int b;
    int c;
    int d;
    int e;
    int f;
    // int g; // Uncomment this -> CRASH

    EndDoc(pd.hDC);
    DeleteDC(pd.hDC);
}
else
{
    cout << "Did not print: " <<  CommDlgExtendedError()  << endl;
}

В тот момент, когда я раскомментирую «int g;Я получаю: «Программа получила сигнал SIGSEGV, ошибка сегментации».Я использую кодовые блоки и компилятор Mingw, оба современные.Что может быть причиной этого?

Ответы [ 3 ]

6 голосов
/ 10 июня 2010

Это означает, что вы испортили свой стек.Случаи, которые вы поместили в стек, оказались в поврежденных данных.Таким образом, поместив дополнительные целые числа в стек, вы по существу отбросили поврежденную память.Если вы не укажете достаточное количество целых чисел, вы будете перезаписывать такие вещи, как адреса возврата функций, резервное копирование регистров и т. П., Что легко вызовет ошибку сегментации.

1 голос
/ 10 июня 2010

Я не знаю, является ли это потенциальной проблемой здесь - но вы всегда должны инициализировать всех членов структур (как вы сделали с PRINTDLG). В структуре DOCINFO элемент lpszDataType не инициализирован. Вместо использования ZeroMemory или memset я предпочитаю что-то вроде DOCINFO di = {0};

0 голосов
/ 10 июня 2010

Я вставил код в Visual Studio, раскомментировал строку и установил для владельца значение 0 pd.hwndOwner = 0; и я не получаю ошибку сегментации, может быть, вы делаете что-то еще, чтобы повредить стек ранее, и когда вы помещаете переменную в стек, вы получаете ошибку?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...