0

I have the following example code:

void doAlloc(int **p) {
  *p = (int *)malloc(sizeof(int));
  **p = 80;
}

int main() {
  int *ptr2;
  doAlloc(&ptr2);
  printf("%d\n", *ptr2);
  free(ptr2);
}

If I understand correctly, ptr2 is a pointer variable, and &ptr2 is "address of" that pointer variable in memory.

My question is, since doAlloc accepts a double pointer int **p as parameter; I don't understand why &ptr is a int **.

I would expect something like this to be done instead:

int **ptr2;
doAlloc(ptr2);

How is the "address of" ptr2 considered to be a valid value to pass as a double pointer?

Any help is greatly appreciated! Thanks.

4

4 回答 4

0

很简单,如果你有

int a;

然后

&a

是类型int*

在您的情况下,您必须为所有出现的事件考虑一个额外的指针。

于 2013-11-10T21:17:43.417 回答
0

'C' 中的指针 - 是的 - 指向内存位置,存储数据的位置(暂时不讨论类型)

所以让我们假设:你做这样的事情(我试着从基础开始):

 int *p = 70;
 *p=65;

然后你让你的'p'指向地址#70(这是我的语法,现在考虑8位字节,没有现代CPU架构),然后你将'65'分配给你的'p'指向的位置-># 70、那么怎么看内存?

#6e ---
#6f ---
#70 65
#71 ---

那么你的'p'在哪里?

#2212 --- here starts the stack
#2213 70 // p! 
#2214 --

然后你打电话:doAlloc(&ptr2);

这意味着:doAlloc 获得 'p' ergo: 2213 的地址,然后将(一个新分配的缓冲区地址(!)放在那里 - 放入 2213 - 让我们说'96'

#2212 --- here starts the stack
#2213 96 // p! new address of buffer 
#2213 --

然后你把'80'放在这个东西指向的地方:96 ...**p = 80;

#68 ---
#69 ---
#70 65
#71 ---
...
#94 ---
#95 ---
#96 80
#97 ---

我希望指出你可以(理论上)写的基本上会发生什么

void doAlloc(int *p) {
  p = (int)malloc(sizeof(int));
  *p = 80;
}

所以不要管所有的第二个'*'

编译器会告诉你这是错误的(确实是这样!),但这就是发生的事情

于 2013-11-10T21:42:06.023 回答
0

&ptr2是 的地址ptr2

因为pt2r是指向整数的指针

&ptr2是一个指向整数的指针:

int ** ptr2;

如果它可能有助于理解上面的代码相当于:

int  *doAlloc() {
  int *p;
  p = (int *)malloc(sizeof(int));
  *p = 80;
  return p; 
}

int main(void) {
  int *ptr2;
  ptr2 = doAlloc();
  printf("%d\n", *ptr2);
  free(ptr2);
}
于 2013-11-10T21:01:33.120 回答
0

指针是变量的地址。的类型ptr2int *(指向 int 的指针),即它包含一个 int 的地址。的参数doAlloc是类型int **(指向 int 的指针的指针),即它包含指向 int 的指针的地址。传递&ptr2传递 的地址ptr2,因为ptr2它是一个指向 int( int *) 的指针,所以它的地址是正确的类型 ( int **)。

(这里需要指针指针的原因是因为doAlloc想要修改 的ptr2指针main,而不仅仅是int它指向的指针。没有指针指针的一种方法是doAlloc返回一个指向已分配内存的指针——然后调用者有责任将其分配给指针。)

于 2013-11-10T21:02:52.653 回答