2014-07-02 39 views
1

我從一個整數數組test[]開始,它表示一組圖像。 test[]的前兩個元素是第一個圖像的高度和寬度。以下四個(height*width)元素是像素值。接下來的六個代表下一個圖像等等。即使指針看起來有效,爲什麼我會得到EXC_BAD_ACCESS?

我的目標是通過圖像對象訪問圖像,而不會複製test[]陣列中的任何內容。我試圖通過ImageSet::import來做到這一點。

int main(){ 
    int test[] = {2,2,1,2,3,4, 
        2,2,4,5,6,7, 
        2,2,9,8,0,9}; 
    ImageSet set = ImageSet(); 
    set.import(test); //ImageSet::import 
    return 0; 
} 

ImageSet::import使用遊標變量存儲下一個圖像的起始索引。它調用Image::import將該數據讀入圖像對象。該特定圖像的數據應該從地址&data[cursor]開始。

void ImageSet::import(int data[]){ 
    int cursor = 0; 
    for(int i = 0; i < NUM_SRC_IMAGES; i++){ 
     int height = data[cursor]; 
     int width = data[cursor+1]; 
     source_[i].import(&data[cursor]); //this is Image::import 
     cursor += height * width + 2; 
    } 
} 

image::import,我試圖通過閱讀data[0]得到一個壞的訪問。根據調試器,data[]指向2的正確值,但當我試圖通過data[0]獲取該值時,仍會拋出EXC_BAD_ACCESS

void Image::import(int data[]){ 
    height_ = data[0]; //the problem occurs right here 
    width_ = data[1]; 
    matrix_ = &data[2]; 
} 

我非常感謝一個解釋我做錯了什麼。我也同樣感謝如何在沒有指針算術的情況下實現我的目標的建議。

謝謝!

+0

你試過把它作爲'source_ [i] .import(data + cursor)'傳遞嗎? – manman

+2

請填寫完整的程序。 http://sscce.org –

+0

在for(int i = 0; i

回答

0

我的猜測是,在優化階段編譯器重新排列你的循環,以

for(int i = 0; i < NUM_SRC_IMAGES; i++){ 
    source_[i].import(&data[cursor]); //this is Image::import 
    int height = data[cursor]; // -> would also crash, but you don't see it because import crashes earlier 
    int width = data[cursor+1]; 
    cursor += height * width + 2; 
} 

而且因爲你定義NUM_SRC_IMAGES太大你正在閱讀過去的測試結束。

順便說一句,你還應該考慮使用類似迭代器樣式的STL,然後調用set.import(begin(test), end(test));通過從底層類型抽象,你可以從任何容器中讀取數據。你可以檢查結束,所以你永遠不會讀完。

0

隨着問題的信息有限,我建議如下:

  1. 嘗試改變進口爲ImageSet::import(const int* data, size_t size)或...最好,ImageSet::import(const int (&data[18])) - 這允許一個明確的參考,而不是數據[]哪些可以在某些情況下被優化掉。後者也明確地向你的同伴指出它是一個數組引用(與指針相反)。相同的Image::import

  2. Image::import中打印出data的值(即&data[0]) - 這會讓您知道地址是否有效。

  3. 在循環結束處ImageSet::import打印出來的值爲cursor

我的猜測是在第三圈左右,cursor價值增長過大,大於18.我不知道你的意圖是什麼...但邏輯(例如)cursor += 3 + 4*2看起來真實可疑。

相關問題