函數無法初始化數組,因爲sizeof()
返回int pointer
的字節數不是myArray
指向的內存大小。初始化通過指針傳遞的數組
void assignArray(int *myArray)
{
for(int k = 0; k < sizeof(myArray); ++k)
{
myArray[k] = k;
}
}
還有其他問題嗎?
謝謝
函數無法初始化數組,因爲sizeof()
返回int pointer
的字節數不是myArray
指向的內存大小。初始化通過指針傳遞的數組
void assignArray(int *myArray)
{
for(int k = 0; k < sizeof(myArray); ++k)
{
myArray[k] = k;
}
}
還有其他問題嗎?
謝謝
我沒有看到其他問題。不過,你可能想要這個:
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;
}
}
如果你不知道大小,你有一個設計錯誤。
但是,如果OP正在分配陣列,這不會起作用 – Praetorian
Darn - 擊敗我30秒! –
@Praetorian:我從上面的代碼中推測出他的確如此。我發佈了答案的後半部分。 –
好吧,沒有其他問題。你說的問題是阻止你初始化數組的唯一的東西。
典型地,這是通過簡單地使大小與所述指針沿解決:
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 ... – StevieG
有兩種類型的數組,你應該能夠分辨。一個看起來像這樣:
type name[count];
這個陣列是type[count]
類型,是不同類型的對於每個count
的。雖然它可轉換爲type *
,但它是不同的。一個區別是sizeof(name)
給你count*sizeof(type)
其他類型的數組是這樣的:
type *name;
這基本上只是一個指針,你可以一個數組例如用malloc
或new
初始化。這個變量的類型是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;
}
}
你期待別的嗎? –
「除此之外,林肯夫人怎麼樣?」 –
這可能是最好的,如果你先解決這個大問題,然後再奇怪這個新的固定版本是否有其他問題。 –