2013-03-23 5 views
1

Я пытаюсь понять, почему работает метод1, а метод2 не работает, когда я передаю «смещение» функции SDL_BlitSurface.Передача указателя на функцию SDL

ПРИМЕНЕНИЕ:

int SDL_BlitSurface(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect); 

На мой взгляд, оба должны работать, так как функция SDL_BlitSurface спрашивает SDL_Rect * в качестве 4-го входного аргумента. И в обоих случаях я передал функцию SDL_Rect *. Однако метод2 дает «Ошибка регистрации ошибки нарушения прав доступа». Пожалуйста помоги!

method1:

SDL_Rect offset; 
offset.x = 1; 
SDL_BlitSurface(source, NULL, destination, &offset); 

method2:

SDL_Rect* offset = NULL; 
offset->x = 1; 
SDL_BlitSurface(source, NULL, destination, offset); 

(код из ленивых Foo в учебнике Урок 2)

ответ

2

Переменная указателя (например, offset) содержит адрес, как адрес дома. Структура рассказывает компьютеру, который живет в доме в каждой комнате (номера имеют имена, например x).

Проблема в том, что вы сначала сказали: «offset - это поддельный адрес (назовите его NULL)». а затем вы говорите «и в комнате x живет 1». Так что это не имеет смысла - номер 1 может жить в комнате x, только если адрес реален. Никто не может жить под фальшивым адресом.

К сожалению, вы можете написать все, что хотите, в коде. Только когда вы запустите его и попробуйте положить 1 в комнату x компьютер кричит. «Нарушение доступа» в основном означает: «вы пытаетесь поместить некоторые данные в адрес, к которому у вас нет доступа». В этом случае, фальшивый адрес NULL не является адрес, который вы можете хранить ничего.

Если следовать предложению Армина, то offset будет указывать на действительный адрес, и что позволит хранить 1 в комнате x. Метод 1 решает проблему, передавая адрес предварительно выделенной структуры offset (он автоматически выделяется компилятором в стеке).

+0

благодарит за ответ –

1

В втором случае вы не защищены какой-либо памяти для offset поскольку SDL_Rect* offset - это просто указатель, вам нужно выделить память, чтобы он указывал на что-то:

Пример в c:

SDL_Rect* offset = malloc(sizeof(SDL_Rect)); 

Затем второй метод будет работать.