Выделение и освобождение памяти, запись 100 чисел в массив, qsort для сортировки их в C - PullRequest
3 голосов
/ 06 ноября 2019

Я пытаюсь выделить место для 100 дублей, проверить, было ли выделение выполнено успешно, а затем освободить место. После этого я хотел бы использовать исходное выделенное пространство, чтобы записать в него 100 случайных чисел, а затем отсортировать их, используя qsort.

. Вот код, который мне нужен на данный момент

#include <stdio.h>
#include <stdlib.h>

int main()
{
    double *num = (double*) malloc(sizeof(double) * 100);

    printf("%lf", *num);

    realloc(num, 0);

    return 0;
}

Когда я пытаюсь напечатать *num, это дает мне 0.00000, что кажется неправильным. Я получаю предупреждение

 warning: ignoring return value of function declared with
 'warn_unused_result' attribute [Wunused-result] realloc(num, 0);

при компиляции программы. Я все еще не уверен, как заставить это работать с массивом.

Ответы [ 2 ]

3 голосов
/ 06 ноября 2019

Неправильно передавать нулевое значение в семейство функций malloc. То, что происходит затем, определяется реализацией, что означает, что разные компиляторы могут давать разные результаты.

C17 7.22.3

Если размер запрошенного пространства равен нулю, поведение является реализацией-defined: либо возвращается нулевой указатель, либо поведение такое, как если бы размер был некоторым ненулевым значением, за исключением того, что возвращенный указатель не должен использоваться для доступа к объекту.

Это необычное использование realloc - обычно компилятор ожидает, что вы используете возвращаемое значение. Отсюда и предупреждение.

Забудьте о realloc(num, 0); и используйте вместо него free().

3 голосов
/ 06 ноября 2019

Я думаю, вы пытаетесь сделать это:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    double *num = (double*) malloc(sizeof(double) * 100);

    if (num) {
        printf("SUCCESS!\n");

        for (int i = 0; i < 100; i++) {
            num[i] = rand();
        }

        /* sort here */

        free(num);
    } else {
        printf("FAILURE!\n");
    }

    return 0;
}
...