1

「オフセット」をSDL_BlitSurface関数に渡すと、method1が機能し、method2が機能しない理由を理解しようとしています。

利用方法:

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

私の考えでは、SDL_BlitSurface 関数は 4 番目の入力引数として SDL_Rect* を要求するため、どちらも機能するはずです。どちらの場合も、関数に SDL_Rect* を渡しました。ただし、メソッド 2 では、「ハンドルされていない例外アクセス違反の書き込み場所エラー」が発生します。助けてください!

方法 1:

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

方法 2:

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

(Lazy Foo のチュートリアル レッスン 2 のコード)

4

2 に答える 2

2

ポインタ変数(のようなoffset)は、家の住所と同じように住所を保持します。この構造は、各部屋の家に住んでいるコンピューターに通知します(たとえば、部屋には名前がありますx)。

問題は、最初に「offset偽のアドレスです(NULLと呼びます)」と言うことです。そして、あなたは「そして部屋xに住んでいる1」と言います。したがって、これは意味がありません。番号1はx、住所が本物である場合にのみ部屋に住むことができます。偽の住所に住むことはできません。

残念ながら、コードには好きなように書くことができます。あなたがそれを実行し、部屋に1を入れようとしたときだけx、コンピュータは叫びます。「アクセス違反」とは、基本的に「アクセスできないアドレスにデータを入れようとしている」という意味です。この場合、偽のアドレスNULLは、何も保存できるアドレスではありません。

Arminの提案に従うoffsetと、は有効なアドレスを指し、それにより部屋に1を格納できるようになりますx。方法1は、事前に割り当てられた構造体のアドレスを渡すことで問題を解決しますoffset(スタック上のコンパイラーによって自動的に割り当てられます)。

于 2013-03-23T11:56:06.520 に答える
1

2番目のケースでは、単なるポインタであるためoffset、メモリを予約していませんSDL_Rect* offset。何かを指すようにメモリを割り当てる必要があります。

の例c

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

次に、2番目の方法が機能します。

于 2013-03-23T11:49:04.887 に答える