#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 .