C 从指针数组初始化和访问指针

C 从指针数组初始化和访问指针,c,pointers,C,Pointers,假设我有以下几点: void **Init(int numElems) { //What is the best way to initialize 'ptrElems' to store an array of void *'s? void **ptrElems = malloc(numElems * sizeof(void *)); return ptrElems; } //What is the best way to return a pointer pointing

假设我有以下几点:

void **Init(int numElems)
{
   //What is the best way to initialize 'ptrElems' to store an array of void *'s?
   void **ptrElems = malloc(numElems * sizeof(void *));
   return ptrElems;
}

//What is the best way to return a pointer pointing at the index passed as a parameter?
void **GetPtr(void **ptrElems, int index)
{
    void **elem = elems + (index * sizeof(void *)); 
    return elem;
} 
首先,初始化“ptrElems”以存储指针数组的最佳方法是什么?我使用malloc是因为在函数结束后,将其分配给数组将不会持久


第二,指向指定索引的指针的最佳方式是什么?我尝试对“GetPtr”函数的第一行进行类型转换,以确保正确的指针算法,但收到警告“初始化来自不兼容的指针类型”。有必要打字吗

初始化应该以这种方式工作,只要记住在使用完内存后再次
释放()

要获取特定元素的地址,可以使用普通数组索引访问和运算符的地址
&

void **GetPtr(void **ptrElems, int index)
{
    void **elem = &ptrElems[index];
    return elem;
} 
您还可以在分配内存后对其调用memset或bzero,这将产生相同的结果,但是如果malloc失败,您必须在将内存归零之前测试返回值

sth的答案将适用于下一部分,但也适用于:

void **GetPtr(void **ptrElems, int index)
{
    return ptrElems + index;
} 

当您向指针添加一个整数时,C假定您希望该整数类似于数组索引,并将其指向的任何值的sizeof乘以该整数。这就是为什么您可以使用++或--a指针并获取指向下一个或上一个元素的指针。

或者,
返回ptrElemns+index,这是完全等效的。不过,
&ptrElems[index]
版本可能看起来更好。malloc是初始化“void**”以指向指针数组的最佳方法吗?
calloc
接受两个值并为您执行乘法
void **GetPtr(void **ptrElems, int index)
{
    return ptrElems + index;
}