我有一个函数,它接受指向结构的指针。
构造ABC;
void func(ABC ** ptr); //func is provided by someone else and i don't know about the implementation.
{
}
现在,我有以下代码。
ABC xyz[2];
ABC * ptr = xyz;
ABC **dptr1 = &ptr; //pointer to ponter
ABC ** dptr2 = (ABC **)malloc(2*sizeof(struct abc*)); //pointer to arrary of pointers
dptr2[0] = &xyz[0];
dptr2[1] = &xyz[1];
如果我将 dptr1 传递给 func,并且 func 执行类似 *ptr[0] 和 *ptr[1] 的操作来访问实际值,它将失败。
那么,传递双指针的标准方法是什么。
最佳答案
当你将ptr1
传递给func
时,实际上传递的是一个指向ptr
占用的内存的指针。问题是 func
似乎假设 ptr1
实际上指向指针数组的开头,但你已经将指针传递给了一个“数组”只有一个指针,ptr
。 func
可能会对您的堆栈造成重大损害。
将指针传递给函数时,您应该做的是确定该函数是将指针当作指针来处理,还是作为指向数组的指针(这里的 func 似乎就是这种情况)。在后一种情况下,您必须小心为函数提供一个数组。
在你的代码中,我会写
ABC xyz[2]; // two ABC's
ABC * ptrs[2]; // array of pointers to ABC's
ptrs[0] = &xyz[0];
ptrs[1] = &xyz[1];
func(ptrs); // C compiler convers an array of pointers to
// a pointer to pointers when passing it to a function
顺便说一句,因为 C 没有数组参数的概念,所以通常最好指定一个具有相关数组长度的附加参数,否则您可能会面临缓冲区溢出漏洞。您的 func
函数可以写成 func(ABC ** ppabc, int elements)
以更好地反射(reflect)它打算如何使用其参数。当前的函数签名意味着 func 实际上只会使用 pointer to pointer 指向的指针(快说三遍!)
关于c - 指针指向指针的正确用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/468611/