2011-01-30 49 views
2

我試圖找到一個數組的大小,sizeof不能正常工作大概是因爲我的數組是一個指針,而不是一個實際的數組(然後,我可能是錯的)。我是新來的C++,但不是編程。C++中的動態數組

這裏是我的功能:

int getSizeOfPointerArray(int a[]){ 
    int n=0; 
    while(true){ 
     if(!a[n]){ 
      cout << "a[" << n << "] doesn't exist, breaking" << endl; 
      break; 
     } 
     cout << "a[" << n << "] exists with value " << a[n] << " at memory address " << &a[n] << endl; 
     n++; 
    } 
    return n; 
} 

調用函數與參數p其中p爲:

p = new (nothrow) int[f]; 

'F' 是3數組的元素收集與:

for(n=0;n<f;n++){ 
    string c = ((n!=f-1)?", ":" "); 
    cout << p[n] << c; 
} 

我曾期待看到記憶數組中的三個元素的陽離子在輸出中打印出來 - 每四個相隔 - 並且說[4]不存在。相反,它打印六個內存地址。前三個值是正確的(所有3個),但最後三個值是-33686,-1414812757和另一個-1414812757。

這是爲什麼?我是否可以將最終結果除以2,還是不總是將指定的元素加倍?這與非動態數組相同嗎?

+1

你在哪裏調用`getSizeOfPointerArray`?你如何初始化數組?數組的最後一個元素應該是0嗎? [示例代碼](http://sscce.org/)除了簡潔之外,還應該是完整和獨立的。你說得對,`sizeof`(當調用指向數組的指針時)不會返回數組的大小,它會返回指針的大小。 – outis 2011-01-30 10:14:28

+0

http://stackoverflow.com/questions/381621/using-arrays-or-stdvectors-in-c-whats-the-performance-gap – Flexo 2011-01-30 10:14:45

+0

@outis:我表明數組已初始化爲p = new(nothrow) INT [F]; – pighead10 2011-01-30 10:20:49

回答

7

當你給new分配一個「數組」時,你只是被賦予了一些目前沒有被別的東西使用的任意內存位置。記憶(及其周圍環境)很可能充滿隨機垃圾,可能不是零。將已知的非零值寫入p[0],p[1]p[2]不會影響居住在p之外的垃圾。因此,你的循環只是通過記憶行走,直到它碰巧碰到一個零(我猜這在這種情況下發生的),或者它碰到記憶它不允許訪問,這會導致seg-fault 。

正如其他人所說,如果您使用C++,您應該利用STL容器類。 std::vector可能是一個簡單數組的最佳替代品。

3

你是對的。你有一個指向一塊內存的指針,而不是一個實際的數組。

int getSizeOfPointerArray(int a[])int getSizeOfPointerArray(int* a)相同,所以無論哪種方式,您仍然會傳遞指向數組中第一個元素的指針。

你在做什麼是未定義的行爲。

沒有可移植的方式來獲取動態分配的大小,因爲它取決於每個操作系統。

如果你有一個實際的數組,你可以做一些與喜歡的模板:

template <typename T, size_t N> 
size_t getSizeInBytes(const T (&array)[N]) 
{ 
    return N * sizeof(T); 
} 
1

最簡單的解決辦法是在STL使用向量類型。它有內置的函數,可以讓你獲得矢量的長度。大小就是單個元素的'sizeof()'的長度。

5

C++代碼無法訪問動態分配數組的大小,我推薦使用std::vector

如果該數組的疊層(例如int arr[2];int arr[] = { 1, 2, 3 })上定義的然後sizeof(arr)將是sizeof(int) * elements_in_arr(甚至那麼你應該更喜歡使用std::tr1::array)。如果你想處理一個在編譯時不知道大小的數組,那麼101%的時間爲std::vector是要走的路(加或減2%)。