Что означает нарушение прав доступа?

Я новичок в C++ и не понимаю, почему я получаю сообщение об ошибке "Место чтения с нарушением прав доступа". Вот мой код:

gdiscreen();
int startX = 1823 - minusX;
int startY = 915 - minusY;
for (int i = startX; i < startX + 61; i++)
{
    for (int j = startY; j < startY + 70; j++)
    {
        Color pixelColor;
        bitmap->GetPixel(i, j, &pixelColor);
        cout << pixelColor.GetValue() << " ";
    }
    cout << endl;
}

gdiscreen() можно найти здесь: http://forums.codeguru.com/showthread.php?476912-GDI-screenshot-save-to-JPG


person user200257    schedule 17.04.2013    source источник
comment
печатает ли что-нибудь? или сразу не получается? откуда битмап? уверен, что он инициализирован правильно?   -  person Keith Nicholas    schedule 18.04.2013
comment
Есть еще вопросы. Что такое minusX и minusY? Вы проверили, входите ли вы с действительными координатами i и j?   -  person Tomáš Zato - Reinstate Monica    schedule 18.04.2013
comment
Что именно означает нарушение прав доступа, не столь важно; важно то, что это означает, что ваша программа неверна и нуждается в отладке.   -  person Kerrek SB    schedule 18.04.2013
comment
Значит у вас что-то не так с памятью. Скорее всего, bitmap не то, что вы думаете. Выполните отладку. Создайте тестовый пример.   -  person Lightness Races in Orbit    schedule 18.04.2013
comment
Он ничего не печатает, и мой тестовый пример за пределами цикла for не работает. Я использовал тот же код в ссылке, но сделал растровое изображение глобальной переменной указателя (я привык к java/C#). Есть еще идеи?   -  person user200257    schedule 18.04.2013
comment
Оооочень много волшебных чисел   -  person SpongeBobFan    schedule 18.04.2013


Ответы (1)


Нарушение прав доступа или ошибка сегментации означает, что ваша программа пыталась получить доступ к памяти, которая не была зарезервирована в области действия.
Приведите несколько примеров, как этого добиться:

Выход за границы массива:

int arr[10];
for(unsigned char i=0; i<=10; i++)  //Will throw this error at i=10
    arr[i]=0;

Примечание. В приведенном выше коде я использую unsigned char для итерации. Char — это один байт, поэтому unsigned char — это 0-255. Для больших чисел может потребоваться unsigned short (2 байта) или unsigned int (4 байта).

Случайное вычисление с указателем вместо целого числа

int ah = 10;
int *pointer = &ah;   //For some reason, we need pointer
pointer++;   //We should've written this: (*pointer)++ to iterate value, not the pointer
std::cout<<"My number:"<<*pointer<<'\n';  //Error - accessing ints address+1

Я намеренно начал с широкого объяснения. Вы хотели знать, что такое нарушение доступа в первую очередь. Я уверен, что в вашем конкретном коде вы перепутали границы i и j. Выполните std::cout отладку.

person Tomáš Zato - Reinstate Monica    schedule 17.04.2013
comment
Превышение границ массива не приведет к AV/SF, когда массив находится в стеке, и также не гарантируется, когда массив находится в куче. И ваш пример указателя int аналогичен, потому что увеличенный указатель обращается к пространству стека, поэтому он также не вызовет AV/SF. Выберите лучший пример, например разыменование нулевого указателя (или почти нулевого указателя). - person Remy Lebeau; 18.04.2013
comment
Разве unsigned char не должно быть unsigned int. - person 0x499602D2; 18.04.2013
comment
@ 0x499602D2: счетчики цикла могут использовать любой числовой тип данных. Поскольку массив в примере содержит только 10 элементов, цикл просто использует наименьший доступный тип данных. - person Remy Lebeau; 18.04.2013
comment
Это кажется довольно касательным к вопросу - person indeterminately sequenced; 18.04.2013
comment
Я не думаю, что это тангенциально, ОП спрашивает, что вызывает ошибку. И это просто чтение/запись недопустимых ячеек памяти. Ошибка может появиться не сразу, может пройти какое-то время, прежде чем она станет очевидной, когда произойдет ошибка. Например, такая функция, как std::string foo(bool which) { if (which) return "Hi!"; }, хотя и является строго допустимой, вызовет повреждение стека и/или кучи. И вы не упадете рядом с вызовом foo, когда вы позвоните foo(false). - person Nathan Ernst; 18.04.2013