2011-10-17 64 views
0

函數無法初始化數組,因爲sizeof()返回int pointer的字節數不是myArray指向的內存大小。初始化通過指針傳遞的數組

void assignArray(int *myArray) 
{ 
    for(int k = 0; k < sizeof(myArray); ++k) 
    { 
     myArray[k] = k; 
    } 
} 

還有其他問題嗎?

謝謝

+3

你期待別的嗎? –

+1

「除此之外,林肯夫人怎麼樣?」 –

+0

這可能是最好的,如果你先解決這個大問題,然後再奇怪這個新的固定版本是否有其他問題。 –

回答

3

我沒有看到其他問題。不過,你可能想要這個:

template<int sz> 
void assignArray(int (&myArray)[sz]) 
{ 
    for(int k = 0; k < sz; ++k) 
    { 
     myArray[k] = k; 
    } 
} 

除非,當然,即使是編譯好好嘗試一下知道它是在編譯時有多大。在這種情況下,你必須明確地傳遞一個大小。

void assignArray(int* myArray, size_t sz) 
{ 
    for(int k = 0; k < sz; ++k) 
    { 
     myArray[k] = k; 
    } 
} 

如果不知道大小,你有一個設計錯誤。

http://codepad.org/Sj2D6uWz

+0

但是,如果OP正在分配陣列,這不會起作用 – Praetorian

+0

Darn - 擊敗我30秒! –

+0

@Praetorian:我從上面的代碼中推測出他的確如此。我發佈了答案的後半部分。 –

6

好吧,沒有其他問題。你說的問題是阻止你初始化數組的唯一的東西。

典型地,這是通過簡單地使大小與所述指針沿解決:

void assignArray(int* myArray, std::size_t mySize) 
{ 
    for (std::size_t k = 0; k < mySize; ++k) 
     myArray[k] = k; 
} 

注意,我使用std::size_t的大小,因爲這是標準的類型,用於存儲大小(這將是8字節的64位機器,而int通常不是)。

在某些情況下,如果大小是靜態已知的,那麼你可以使用一個模板:

template <std::size_t Size> 
void assignArray(int (&myArray)[Size]) 
{ 
    for (std::size_t k = 0; k < Size; ++k) 
     myArray[k] = k; 
} 

然而,這僅適用於數組,而不是指針分配的數組。

int array1[1000]; 
int* array2 = new int[1000]; 
assignArray(array1); // works 
assignArray(array2); // error 
+1

對於一個有用的,毫不客氣的,樸素的答案+1 ... – StevieG

0

有兩種類型的數組,你應該能夠分辨。一個看起來像這樣:

type name[count]; 

這個陣列是type[count]類型,是不同類型的對於每個count的。雖然它可轉換爲type *,但它是不同的。一個區別是sizeof(name)給你count*sizeof(type)

其他類型的數組是這樣的:

type *name; 

這基本上只是一個指針,你可以一個數組例如用mallocnew初始化。這個變量的類型是type *,正如你所看到的,沒有計數類型的信息。因此,sizeof(name)會爲您提供計算機中指針的大小,例如4或8個字節。

爲什麼這兩個sizeof有所不同,你問?因爲sizeof在編譯時被評估。請看下面的代碼:

int n; 
cin >> n; 
type *name = new type[n]; 

現在,當你說sizeof(name),編譯器無法知道n可能的未來價值。因此,它不能計算sizeof(name)作爲陣列的實際大小。此外,name指針可能不會指向數組!

你應該怎麼做,你問?簡單。將數組的大小保存在一個變量中,並將其拖放到您將數組放在哪裏。所以在你的情況下,它會是這樣的:

void assignArray(int *myArray, int size) 
{ 
    for(int k = 0; k < size; ++k) 
    { 
     myArray[k] = k; 
    } 
}