大的超出范围的数字出现在c++ rand()中

Large out-of-range numbers appear in C++ rand()

本文关键字:rand c++ 范围 数字      更新时间:2023-10-16

需要在范围内有一个充满随机数的数组。代码:

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 %dn",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放入括号中也没有帮助。这些数字是什么,我怎么去掉它们?

注:在蹩脚的dev - c++和Code::Blocks中尝试了相同的结果。需要程序是小尺寸的(把它放在dropbox),所以不,我不能使用100mb的boost库。

void fillArray(int *arr){
    for(int i=0;i<(sizeof arr);i++){

由于arr是指向整数的指针,因此sizeof arr相当于sizeof (int *),在您的平台上显然是4(32位)。这显然不是你想要的。你只传递给fillArray一个指向数组第一个元素的指针。

如果需要指针指向的数组中元素的个数,则需要传递该信息。C和c++语言没有办法告诉指针指向多少字节。

你在arrPoint中做得正确。

数组并不像你想象的那样工作。不能使用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的指针,CC_16通常是4或8字节长。必须将数组的长度(而不是以字节为单位的大小)作为附加参数传递给函数。

尝试使用_countof(arr)代替sizeof(arr)_countof返回数组的大小,而不是指针的大小——请注意这一点。