[英]Large out-of-range numbers appear in C++ rand()
需要具有一個范圍內充滿隨機數的數組。 碼:
void fillArray(int *arr){
for(int i=0;i<(sizeof arr);i++){
arr[i] = rand() % 2 - 2;
}
}
int *arrPoint(int *arr, int max){
for (int i=0;i<max;i++){
printf("%d is %d\n",i,arr[i]);
}
return arr;
}
int main(int argc, char *argv[]){
srand ( time(NULL) );
int arr_f[15];
fillArray(arr_s);
arrPoint(arr_s, 15);
system("PAUSE");
return EXIT_SUCCESS;
}
輸出:
0 is -2
1 is -1
2 is -2
3 is -1
4 is 0
5 is 0
6 is 4633240
7 is 2686652
8 is 1973724226
9 is 1974338216
10 is 2686716
11 is 1973744850
12 is 8
13 is 1973752206
14 is 1973752162
Press any key to continue . . .
我勒個去? 將rand()%2放在方括號中也無濟於事。 這些數字是什么,我如何擺脫它們?
PS在糟糕的Dev-C ++和Code :: Blocks中進行了嘗試,結果相同。 需要程序小巧(將其放入Dropbox),所以不行,我不能使用100mb boost lib。
void fillArray(int *arr){
for(int i=0;i<(sizeof arr);i++){
由於arr
是指向整數的指針,因此sizeof arr
等效於sizeof (int *)
,在您的平台上顯然為4(32位)。 那顯然不是您想要的。 您只需將fillArray
的指針傳遞給數組的第一個元素。
如果您需要指針指向的數組中元素的數量,則需要傳遞該信息。 C和C ++語言無法僅通過給定指針就知道指針指向多少字節。
您可以在arrPoint
正確執行此arrPoint
。 在fillArray
中這樣fillArray
。
數組無法像您想象的那樣工作。 您不能使用sizeof
神奇地獲取數組大小。 作為函數參數傳遞時,數組會衰減到指向其第一個元素的指針,並且您必須單獨提供大小信息:
int main()
{
int * arr = new int[20];
the_function(arr, 20);
//...
delete[] arr;
}
void (int * arr, std::size_t size)
{
for (std::size_t i = 0; i != size; ++i)
{
// something with arr[i]
}
}
更好的是,使用std::vector<int>
可以避免所有此類頭痛,甚至可以避免很多頭痛。
(我的聲明有一個例外:對於局部范圍內的自動數組int b[10]
, sizeof(b)
的確會返回10 * sizeof(int)
。但這只是因為編譯器知道數組的大小。大小信息不會傳遞,並且在運行時不可用。)
在fillArray
(sizeof arr)
是指針的大小,而不是數組的大小。
您的問題是sizeof
運算符。 arr
是一個指向int
的指針,它通常為4或8個字節長。 您必須將數組的長度 (而不是字節大小)作為函數的附加參數傳遞。
嘗試使用_countof(arr)
代替sizeof(arr)
。 _countof
返回數組的大小,而不是指針-請注意這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.