c - 指针指向指针的正确用法

标签 c pointers

我有一个函数,它接受指向结构的指针。

构造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 实际上指向指针数组的开头,但你已经将指针传递给了一个“数组”只有一个指针,ptrfunc 可能会对您的堆栈造成重大损害。

将指针传递给函数时,您应该做的是确定该函数是将指针当作指针来处理,还是作为指向数组的指针(这里的 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/

相关文章:

c - 递归函数降序输出

在简单程序中复制到指针时,C strcpy 不起作用?

c - CLOCK_TAI 的纪元是什么?

c++ - 我可以以这种方式将数组转换为指针并返回指向常量的指针吗?

c - 我如何将 const 指针发送到 c 中的非 const 指针?

c - 在 C 编程中,将数据写入 .txt 文件时如何移动到下一行

c - 在我的 C 程序中,全局变量初始化为 1 而不是 0

c - 指向结构的指针声明会为其成员分配内存吗?

使用指针连接两个数组(提供 C 代码)

将整数转换为另一个字符指针