假设我有以下内容:
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'函数的第一行进行类型转换以确保正确的指针算法,但我收到警告,'从不兼容的指针类型初始化'。是否有必要进行类型转换?
答案 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指向整数的次数。这就是为什么你可以++或 - 指针并获得指向下一个或前一个元素的指针。