2011-04-21 74 views
0
 
long fibonacci(int ceiling) 
{ 
    int counter; 
    long num1 = 1, num2 = 1, sum; 
    int arr[ceiling+1]; 
    for (counter = 1; counter < ceiling; counter++) 
    { 
     arr[counter] = num1; 
     //printf("%d\n", num1); //prints sequence 
     sum = num1+num2; 
     num1 = num2; 
     num2 = sum; 
    } 
    return arr; 
} 

現在,如果我嘗試訪問這個數組,就說int a = fibonacci(10);,它沒有投訴。但是,如果我試圖訪問一個單獨的元素,如a[1],它告訴我,斐波那契和數組返回

下標值既不是數組,也不指針

我在做什麼錯?

+0

打開編譯器警告並檢查所有消息。 – 2011-04-21 07:03:35

+0

我怎麼去那 – tekknolagi 2011-04-21 07:04:05

回答

4

..如果我嘗試訪問indivicual元件,像一個[1],或東西..

int a = fibonacci(10); 

a是整型變量,而不是陣列中使用的運算符[]上它。

方法的定義應該是 -

int* fibonacci(int ceiling) 
{ 
    // ... 
    return arr ; 
} 

int *a = fibonacci(10) ; 

現在你可以使用a操作[]不管怎樣,你要返回的是一個局部變量(即,駐留在堆棧上)的引用,這是錯誤的。您應該使用malloc動態分配陣列的內存,並且應該稍後free它。

+0

我將如何訪問數組? – tekknolagi 2011-04-21 06:58:15

+0

@tekknolagi - 您可以在指針變量上使用'[]'來提及您想訪問的變量的索引。 – Mahesh 2011-04-21 07:07:33

0

您應該返回INT [],不要長時間

編輯: 對不起,混合的C#:)

int* fibonacci(int ceiling) 
.... 

//調用

int *a = fibonacci (10); 
int val = a[20]; 
+0

謝謝您解決任何問題嗎? – tekknolagi 2011-04-21 06:59:52

+0

@tekknolagi - 對不起,我正在使用C#。編輯回答 – Haplo 2011-04-21 07:06:42

+0

我現在得到一個段錯誤...到底是什麼 – tekknolagi 2011-04-21 07:12:33

0

應該返回long *和arr應該很長*,從堆中獲取內存,因爲a)您希望在函數返回後您的數組持久存在,並且b)所有操作數的類型都是long:

long* fibonacci(int ceiling) 
{ 
    int counter; 
    long num1 = 0, num2 = 1, sum; //F is seeded with F(0) = 0, F(1) = 1 
    long* arr = malloc((ceiling+1)*sizeof(long)); 
    //include ceiling in the loop since you have ceiling+1 elements 
    for (counter = 0; counter <= ceiling; counter++) 
    { 
     arr[counter] = num1; 
     //printf("%d\n", num1); //prints sequence 
     sum = num1+num2; 
     num1 = num2; 
     num2 = sum; 
    } 
    return arr; 
} 
1

解決這個最簡單的方法是將數組在調用點分配和它傳遞給要填充的斐波那契功能。

void fibonacci(int n, int arr[]) 
0

比以前更重要的是,你應該考慮內存分配。 僅使用int arr[ceiling+1];將爲該函數中的作用域創建一個變量的內存。因此,您可能會返回一個指向內存位置的數組的指針,該數組可能會被覆蓋。 使用malloc代替

0

一個更好的版本與錯誤修正:

#include <stdio.h> 
int fibonacci(int ceiling, int *arr) 
{ 
    int counter; 
    long num1 = 1, num2 = 1, sum; 
    if(arr == NULL) 
     return -1; 
    for (counter = 0; counter < ceiling; counter++) { 
     arr[counter] = num1; 
     //printf("%d\n", num1); //prints sequence 
     sum = num1+num2; 
     num1 = num2; 
     num2 = sum; 
    } 
    return 0; 
} 
int main (int argc, char const* argv[]) 
{ 
    int ceiling = 10; 
    int arr[ceiling + 1]; 
    fibonacci(ceiling, arr); 
    return 0; 
} 
2

不能在C(或C++)返回一個陣列,這樣,從一個函數。

你的代碼當前所做的是:它隱式地將int []數組衰減爲int *指針,然後隱式地將int *轉換爲long,然後返回long。這不是一個指針或數組,因此下標操作符可能不適用於它。

你可以返回一個int *,但有指針​​返回到本地arr陣列將是錯誤的(你的編譯器可能無法捕獲錯誤,但你會調用在運行時未定義行爲),因爲只要該功能完成,arr正式不存在並且返回的指針因此是懸掛的。

您可以:

  • 分配使用malloc(數組)並返回指針(但你必須弄清楚誰去給free()的分配,並確保這種情況發生正好一次);或

  • 傳入一個指向數組的指針,並通過該指針填充數組(現在調用者負責創建和管理數組) - 這可能是C中常用的方法;或

  • 創建一個包裝數組的結構,並返回其中一個(或者,就此而言,將指針傳遞給另一個)。

還要注意的是int arr[ceiling + 1];是C99結構;它不允許在標準的「傳統」C(C89等)中,也不允許在符合標準的C++中使用。在這些語言中,編譯時必須知道數組的大小。在C++中,你也可以通過引用傳遞一個數組,或者使用boost::array(這是「一個封裝數組的結構」,但也使用運算符重載使它更像數組一樣透明)。

+0

+1這。我會馬上刪除我的答案,因爲,好吧。相比之下,它是如此錯誤*);) – 2011-04-21 12:19:23