初始化和访问指针数组中的指针

时间:2010-04-27 03:52:12

标签: 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 at the index passed as a parameter?
void **GetPtr(void **ptrElems, int index)
{
    void **elem = elems + (index * sizeof(void *)); 
    return elem;
} 

首先,将'ptrElems'初始化以存储指针数组的最佳方法是什么?我使用malloc,因为在函数结束后将它分配给数组将不会持久存在。

其次,指向指定索引处指针的最佳方法是什么?我尝试对'GetPtr'函数的第一行进行类型转换以确保正确的指针算法,但我收到警告,'从不兼容的指针类型初始化'。是否有必要进行类型转换?

2 个答案:

答案 0 :(得分:1)

初始化应该以这种方式工作,一旦完成,只需记住free()内存。

要获取特定元素的地址,您可以使用普通数组索引访问以及地址操作符&

void **GetPtr(void **ptrElems, int index)
{
    void **elem = &ptrElems[index];
    return elem;
} 

答案 1 :(得分:0)

void **Init(int numElems)
{
   //  This allocates the memory and sets it to 0 (NULL)
   void **ptrElms = calloc(numElems * sizeof(void *) );
   return ptrElems;
}

你可以在分配后调用内存中的memset或bzero,这会产生相同的结果,但是如果malloc失败,你必须在调整内存之前测试返回值。

某人的答案适用于下一部分,但也会如此:

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

向指针添加整数时,C假设您希望整数与数组索引类似,并添加sizeof指向整数的次数。这就是为什么你可以++或 - 指针并获得指向下一个或前一个元素的指针。