繁体   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