2014-01-18 43 views
1
#include <stdio.h> 
#include <iostream> 

using namespace std; 


int write(int arr[]) 
{ 

    int n = (sizeof(arr)/sizeof(arr[0])); 

    for(int r=0;r<n;r++) 
    { 
     printf("%d\n", arr[r]); 
    } 

    return 0; 
} 

int main() 
{ 
    int numlist[] = {1, 3, 5, 6, 7, 9, 0, 2, 3}; 

    write(numlist); 

    std::string strvar; 
    std::cin >> strvar; 

} 

正在屏幕上打印的數字只是數字'1'。而已。 剛剛開始C,我只是想獲得語法的竅門。在函數中使用數組 - C

+0

你想做什麼?你期待的結果是什麼? – rullof

+2

在函數'main'中計算'int n =(sizeof(arr)/ sizeof(arr [0]))'並在調用函數'write'時傳遞它。 –

+0

沒想到我的錯誤會出現在特定的代碼行中。 –

回答

5

您不能計算陣列的尺寸內使用

(sizeof(arr)/sizeof(arr[0])); 

這是函數,因爲函數只看到arr作爲一個指針(數組衰減成一個指針),而不是一個完整的數組。因此,n將是1

您必須將大小作爲額外參數傳遞。

int write(int arr[], int n) 
{ 
    for(int r=0;r<n;r++) 
     printf("%d\n", arr[r]); 

    return 0; 
} 

並用

write(numlist, sizeof(arr)/sizeof(arr[0])); 
+0

完美,謝謝! –

2

的問題是以下行

int n = (sizeof(arr)/sizeof(arr[0])); 

在這種情況下C有不知道的arr的長度是多少。 C中的數組只是沒有固有的長度屬性。因此,當你說sizeof(arr)它不是元素的數量而是1

爲了使這項工作,你需要明確傳遞的元素數量的數組中的功能與陣列

2

int n = (sizeof(arr)/sizeof(arr[0]));不會在這方面的工作進展,因爲arr是已腐爛的函數參數在這一點上的指針。將元素的數量傳遞給函數或使用標記值標記數組的末尾。

3

int write(int arr[]) 

arrint*sizeof(arr)/sizeof(arr[0])對你來說是1,因爲指針與系統上的整數大小相同。

只有在有權訪問其定義時,才能計算數組中元素的數量。在你的情況下,這隻在main之內。如果你想將數組傳遞給另一個函數你還需要通過其長度

int write(int* arr, size_t num_elems) 
{ 
    for(int r=0;r<num_elems;r++) { 
     printf("%d\n", arr[r]); 
    } 
    return 0; 
} 

int main() 
{ 
    int numlist[] = {1, 3, 5, 6, 7, 9, 0, 2, 3}; 
    size_t num_elems = sizeof(arr)/sizeof(arr[0]); 
    write(numlist, num_elems); 
} 

另外,如果你定義標誌着數組的結尾警戒值,你並不需要通過一個長度

int write(int* arr) 
{ 
    while (*arr != -1) { 
     printf("%d\n", *arr); 
     arr++; 
    } 
    return 0; 
} 

int main() 
{ 
    int numlist[] = {1, 3, 5, 6, 7, 9, 0, 2, 3, -1}; /* element with value -1 
                 marks the end of the 
                 array */ 
    write(numlist); 
} 
1
在C/C++,當作爲arrayName中參數傳遞

調用它,它的轉換成指針。 所以在該函數中sizeof(arr)等於sizeof(int *)。

INT C++

int a[10]; 
int (&b)[10] = a; // b is a reference of int array whose length is 10; 

//so here could be ok 
template< size_t n> 
size_t write(int (& new_array_name)[n]) 
{ 
    // 
} 
1

在64位操作系統,的sizeof(ARR [0])被返回4個字節,而的sizeof(ARR)將返回2個字節。在我的系統中,n的值爲2.由於這個原因,循環在我的系統上執行兩次r <。在32位操作系統上,sizeof(arr [0])返回2個字節而不是4個字節。這就是爲什麼你要獲得arr的索引0才能被執行。