Почему моя функция возвращает такие большие случайные значения, когда она имеет диапазон? - PullRequest
0 голосов
/ 21 апреля 2019

Я пытаюсь получить случайные значения с плавающей точкой в ​​диапазоне в указателе, но он дает мне очень большие числа. Я думаю, что моя ошибка в вызове функции, но я не уверен.

Это функция:

#include <time.h>
#include <stdlib.h>
void random_values(float *arr, int N) // "arr" is used like an array to 
                                      //keep random float values

{                                     // "N" is the length of the array
    int i;
    float max_range=1000.00;
    arr=(float *)(malloc(sizeof(float)*N));
    srand(time(0));
    for(i=0; i<N; i++)
    {
        *(arr+i)=((float)rand()/(float)(RAND_MAX)) * max_range;

    }
    free(arr);
}

Здесь я вызываю функцию и пытаюсь распечатать ее:

random_values(arr, length);
for(i=0;i<length;i++)
    printf("%.2f\n", *(arr+i));

1 Ответ

1 голос
/ 21 апреля 2019

Ваша random_value функция выделяет некоторую память, заполняет ее случайными значениями, а затем освобождает. Он никогда не использует переданный в него указатель ни для чего. Он не помещает случайное значение туда, куда указывает этот указатель, он не копирует случайные значения в память, указанную этим указателем, он не возвращает указатель на вызывающую функцию, и даже если он это сделал - он освобождает блок памяти в любом случае. Таким образом, вызывающий не сможет получить доступ к случайным значениям.

Давайте пройдемся по строке:

void random_values(float *arr, int N) // "arr" is used like an array to 
                                  //keep random float values

{                                     // "N" is the length of the array
    int i;
    float max_range=1000.00;
    arr=(float *)(malloc(sizeof(float)*N));

Хм, а что? Мы получили массив, который должны были использовать, но затем мы полностью заменили это значение указателем на другой массив?

    srand(time(0));
    for(i=0; i<N; i++)
    {
        *(arr+i)=((float)rand()/(float)(RAND_MAX)) * max_range;

    }
    free(arr);

Хорошо, мы храним все случайные значения в блоке памяти, но тогда мы free блок памяти? Какой в ​​этом смысл?

}

random_values(arr, lenght);
    for(i=0;i<lenght;i++)
        printf("%.2f\n", *(arr+i));

Этот код передает arr в random_values, что игнорирует его. Затем он печатает содержимое arr, которое, вероятно, содержит случайный мусор, так как ничто никогда не следовало за этим указателем, и помещает данные туда, куда он указывал.

...