2013-10-15 101 views
2

我無法理解指向結構的指針數組。我創建了這個簡單的例子來更好地理解它們。雖然它編譯了,但我仍然在下面所示的地方出現「BAD ACCESS」崩潰(廢話指針)。任何人都可以解釋爲什麼這是錯的?創建指向結構的指針數組 - C++

#include <iostream> 
using namespace std; 

struct complex_num { 
    double real_part; 
    double imag_part; 
}; 

void init_complex(complex_num *element) { 
    element->real_part = -1.0;    // <--- EXECUTION STOPS HERE. 
    element->imag_part = 1.0; 
} 

int main(int argc, char *argv[]) { 
    int n = 5; 

    complex_num *array[n]; // Allocates for an array of n pointers to 
          // the complex_num structure, correct? 

    for (int i = 0; i < n; i++) { 
     init_complex(array[i]); 
    } 

    return 0; 
} 

我知道有更好的方法來做到這一點。我知道這是非常C的風格。請不要建議不同的數據結構。我很好奇指向結構指針的數組。謝謝!

回答

4

您沒有爲您的complex_num對象分配內存,只能爲具有指向它的數組分配內存。所以當你調用init_complex的時候,它會在指向無效位置的指針上運行。

試試這個:

for (int i = 0; i < n; i++) { 
    array[i] = new complex_num(); 
    init_complex(array[i]); 
} 

你的陳述complex_num *array[n]創建n個指針數組來complex_num。意思是,陣列可以容納n指針到complex_num;但指針本身仍未初始化。它們指向隨機位置 - C++中的每個未初始化的基元(指針都屬於這個基元)通常只包含分配之前內存位置中的任何值。這幾乎肯定會導致意想不到的結果,因爲沒有辦法(或者至少沒有合理簡單的方法)告訴未初始化的指針指向何處。

所以你必須讓陣列中的每個指針指向一些正確設置的內存位置,包含complex_num;只有在此之後,您才能訪問(讀取或寫入)指針指向的complex_num中的值。爲了使它例如指向一個動態分配的新complex_num對象,使用上面的代碼(注意動態分配的new關鍵字)。注意:指向動態分配對象的「Raw」指針(如上所示)很難處理(完成後不應忘記調用delete,否則會泄漏內存),因此建議的練習通常是使用智能指針(就像使用C++ 11引入的std :: shared_ptr)。

1

是的,沒有內存分配給您聲明的指針。它不指向任何有效的結構對象