簡體   English   中英

大的超出范圍的數字出現在C ++ rand()中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM