Это правильное использование функции mallo c ()? - PullRequest
1 голос
/ 13 июля 2020

У меня возникли проблемы с пониманием использования mallo c () после просмотра большого количества видеороликов, объясняющих его использование. В частности, я не понимаю необходимости использования указателя void при вызове. В следующем коде я запрашиваю массив двойных чисел, длина которых мне не известна во время компиляции. Он работает так, как я ожидал, и компилятор не жалуется, но я хотел бы знать, не создаю ли я проблем в более сложном случае. Это было скомпилировано с помощью gcc -Wall -g -o test test.c -lm:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <math.h>

int  main()  {

 char in[10];        /*  input from stdin  */
 int index;

 double width;       /*  segment size      */
 int divisions;      /*  number of segments  */
 double start;       /*  lower "Reimann" limit  */
 double end;         /*  upper "Reimann" limit  */
 double *rh_ptr;     /*  base of array of right hand edges */

 printf("Enter start and end values along x axis\n");
 printf("Start -- ");
 fgets(in, 10, stdin);
     sscanf(in, "%lf", &start);
 printf("End   -- ");
 fgets(in, 10, stdin);
     sscanf(in, "%lf", &end);
 printf("Number of divisions for summation -- ");
 fgets(in, 10, stdin);
     sscanf(in, "%i", &divisions);
 width = ((end - start) / (double)divisions);


 rh_ptr = malloc(divisions * sizeof(*rh_ptr));
     if(rh_ptr == NULL) {
        printf("Unable to allocate memory");
        exit(0);
     }

 for(index = 0; index < divisions; index++) {
     rh_ptr[index] = start + (width * (index + 1));
     printf("value = %fl\n", rh_ptr[index]);
 }
     printf("\n\n");

 return(0);
}

Ответы [ 2 ]

3 голосов
/ 13 июля 2020

mallo c () возвращает указатель void, так как он должен быть generi c, способный предоставить вам любой тип указателя, который вы хотите. Это означает, что перед использованием его необходимо переделать. Вы используете mallo c правильно, указатель, возвращаемый mallo c, автоматически преобразуется в указатель типа double * (указатель, который указывает на double).

1 голос
/ 13 июля 2020

В частности, я не понимаю необходимости пустого указателя при вызове.

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

Полагаю, вы говорите об этой строке:

rh_ptr = malloc(divisions * sizeof(*rh_ptr));

А вы, возможно, запутались со значением sizeof(*rh_ptr)? Поскольку это выражение оценивает размер в байтах разыменованного типа rh_ptr или, в вашем случае, размер double, ie 8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...