将malloc铸造至(空心**) 我们假设,在C++中,我使用 MalOC 为4x空指针分配内存: malloc(4*sizeof(void*))

将malloc铸造至(空心**) 我们假设,在C++中,我使用 MalOC 为4x空指针分配内存: malloc(4*sizeof(void*)),c++,malloc,C++,Malloc,由于malloc返回一个空指针,因此我假设以下赋值有效: void *x; x=(void*)malloc(4*sizeof(void*)); 然而,我在论坛上找到的大多数代码在分配任务之前都会转换到(void**),如下所示: void **y; y=(void**)malloc((4*sizeof(void*)); 我知道这是一个“指针对指针”的铸造,但这有什么用途? (void**)铸造比(void*)有什么优势?是因为我把内存分配给指针而不是值吗 另一个问题。。。上述情况下的铸造是否

由于
malloc
返回一个空指针,因此我假设以下赋值有效:

void *x;
x=(void*)malloc(4*sizeof(void*));
然而,我在论坛上找到的大多数代码在分配任务之前都会转换到
(void**)
,如下所示:

void **y;
y=(void**)malloc((4*sizeof(void*));
我知道这是一个“指针对指针”的铸造,但这有什么用途?
(void**)
铸造比
(void*)
有什么优势?是因为我把内存分配给指针而不是值吗

另一个问题。。。上述情况下的铸造是否等同于以下情况

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

假设您正在为一个整数变量分配内存,那么我们使用指向整数的指针
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 = &iVar;
    vpptr = &vptr;

    printf("piVar = %d , ppiVar = %d vptr = %d and vpptr =%d \n", *piVar,**ppiVar, *(int* )vptr, **(int **)vpptr);
    return 0;
}
#包括
#包括
int main()
{
int-iVar=99;
int*piVar;
int**ppiVar;
void*vptr;
void**vpptr;//这里void*也够了,但我们应该知道何时提取,提取什么
piVar=malloc(sizeof(int));
*piVar=10;
ppiVar=malloc(sizeof(int*));
*ppiVar=piVar;
vptr=&iVar;
vpptr=&vptr;
printf(“piVar=%d,ppiVar=%d vptr=%d和vpptr=%d\n”,*piVar,**ppiVar,**(int*)vptr,**(int**)vpptr);
返回0;
}

C++要求显式转换指针。它强迫你停下来思考“我做对了吗?”当你看到C++中的某个角色(或者是<代码> RealtType Case<代码>)时,你应该停下来,想知道是否犯了错误,然后被一个更大的错误掩盖。在考虑过你应该确保没有错误之后。旁注:在C++中,在非常精细的、低级的构建块中,只有在很少的情况下才使用<代码> MalOC 。更喜欢库容器,然后<代码>新< /COD>,最后是代码> MalOC 或朋友。这是代码> C<代码>代码,而不是C++。对<代码> MaloC/<代码>的调用需要C++中的强制转换。