Преобразование malloc в (void **)

#c #malloc

#c #malloc

Вопрос:

Допустим, в C я использую malloc для выделения памяти для 4-кратных указателей void:

 malloc(4*sizeof(void*))
  

Поскольку malloc возвращает указатель void, я предполагаю, что следующее назначение допустимо:

 void *x;
x=(void*)malloc(4*sizeof(void*));
  

Тем не менее, большая часть кода, который я нахожу на форумах (void**) , выполняется перед назначением, например:

 void **y;
y=(void**)malloc((4*sizeof(void*));
  

Я понимаю, что это приведение «указатель на указатель», но какой цели это служит?
Какое преимущество имеет (void**) приведение (void*) ? Это потому, что я выделяю память указателям, а не значениям?

Еще один вопрос… будет (void**) ли приведение в приведенном выше случае эквивалентно следующему?

 int *x;
x=(void*)malloc(4*sizeof(void*));
int **y;
y=amp;x;
  

Комментарии:

1. C требует явного преобразования указателей. Это заставляет вас остановиться и подумать: «Правильно ли я поступаю?» Когда вы видите подобное приведение (или a reinterpret_cast ) по какой-либо причине в C , вы должны остановиться и задаться вопросом, не допущена ли ошибка, а затем прикрыта большей ошибкой. И, задаваясь вопросом, вы должны убедиться, что ошибки нет. Примечание: в C вы хотите использовать только malloc в редких случаях при работе с очень сложными, низкоуровневыми строительными блоками. Предпочитайте библиотечный контейнер, затем new и, наконец malloc , или друзей.

Ответ №1:

допустим, вы выделяете память для целочисленной переменной, тогда мы используем указатель на целое число int*

предположим, если вы хотите выделить память для переменной-указателя, тогда мы используем указатель на poniter int**

то же самое относится и к void* , надеюсь, приведенный ниже пример поможет вам.

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

int main()
{

    int iVar = 99;
    int *piVar;
    int **ppiVar;
    void *vptr;
    void **vpptr; // here void * also, enough, but we should know when we extract, what to extract 

    piVar = malloc(sizeof(int));
    *piVar = 10;

    ppiVar = malloc(sizeof(int *));
    *ppiVar = piVar;

    vptr = amp;iVar;
    vpptr = amp;vptr;

    printf("piVar = %d , ppiVar = %d vptr = %d and vpptr =%d n", *piVar,**ppiVar, *(int* )vptr, **(int **)vpptr);
    return 0;
}
  

Комментарии:

1. Это C код, а не C . Для вызова malloc требуется приведение в C .