2016-10-14 41 views
2

好的,所以我在我的程序中有一個奇怪的問題,我真的不明白髮生了什麼。問題是:簡單的程序幫助 - 發送動態內存指針功能

  • 當我只用例1,我的程序崩潰
  • 當我使用例2]它的工作原理

你能向我解釋爲什麼我不能用第一例?

#include <iostream> 
using namespace std; 

int show(int **a, int *n){ 
    int i; 
    for(i=0; i<*n; i++){ 
     cout << "number is: " << *a[i] << endl; // EXAMPLE 1 
     cout << "number is: " << *(*a+i) << endl; // EXAMPLE 2 
    } 
} 

main() { 
    int n = 3, i; 
    int *a = new int[n]; 
    for(i=0; i<3; i++){ 
     cout << "number: "; 
     cin >> a[i]; 
    } 
    show(&a, &n); 
} 
+0

第一,需要前主 – Danh

+1

一個int然後,這裏是的說明中,是一個指針的指針到3整數的數組的第一個元素。那麼你需要首先得到指向第一個元素的指針 – Danh

+0

在例1中,你取消引用了一些不屬於你的指針,這是未定義的行爲。 – Danh

回答

4

operator[]的優先級高於operator*,所以*a[i]是相同*(a[i])。請注意,a是指向單個int*,因此*(a[1])(遵循a[1])將導致UB。

你可以用圓括號來指定你想要的優先順序,把它改爲(*a)[i]然後它就可以正常工作。


BTW1:你應該聲明返回類型爲main(),像int main() { ... }
BTW2:我建議你使用std::vectorstd::array而不是原始數組,因爲它是C++。

+0

另外,考慮到這是C++和你的函數沒有測試'a'不是null,可能參考是什麼? –

+0

@TobySpeight我不確定OP的意圖,我同意傳遞指針在這裏沒有多大意義。實際上,對於C++來說,最好的方法應該是'int show(const std :: vector &a)'。 – songyuanyao