2013-03-23 93 views
1

我想知道爲什麼method1工作,而method2不工作,當我傳遞「偏移」到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會產生「未處理的異常訪問衝突寫入位置錯誤」。請幫忙!

方法一:

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); 

(代碼從懶惰Foo的指導課程2)

回答

2

指針變量(如offset)擁有一個地址,就像一個房子地址一樣。 結構告訴住在每個房間的房子裏的電腦(房間有名字,例如x)。

問題是你首先說:「offset是一個虛假的地址(稱之爲NULL)。」然後你說「在房間x住1」。所以這沒有意義 - 只有地址是真實的,號碼1才能住在房間x中。沒有人可以生活在一個虛假的地址。

不幸的是,你可以在代碼中寫任何你想要的東西。只有當你運行它,並試圖把1放在房間x電腦喊。 「訪問違規」基本上意味着:「您正試圖將一些數據放入您無權訪問的地址中」。在這種情況下,假地址NULL是不是你可以存儲。

如果按照阿明的建議任何一個地址,然後offset將指向一個有效的地址,這將允許你存儲1在房間裏x。方法1通過傳遞預分配結構的地址offset(它由編譯器自動分配到堆棧上)來解決問題。

+0

感謝您的回覆 – 2013-03-23 12:00:34

1

秒情況你沒有保留任何內存offset因爲SDL_Rect* offset只是一個指針,所以你必須爲它指定一些內存:

實例c

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

然後你第二個方法會奏效。