为啥传递给函数的指针的值没有改变? [复制]

Posted

技术标签:

【中文标题】为啥传递给函数的指针的值没有改变? [复制]【英文标题】:Why does not the value of the pointer passed to the function change? [duplicate]为什么传递给函数的指针的值没有改变? [复制] 【发布时间】:2017-05-23 20:50:46 【问题描述】:

我将指针作为参数传递给函数。在函数内部我改变了它->它已经改变了。但之后的输出与函数调用之前相同。指针没有改变。怎么了?

void GetFrom(PVOID lpBuffer)
lpBuffer = malloc(12);
memset(lpBuffer, 0, 12);
printf("%p",pointer); // 0000028D46DECE50


PVOID pointer = 0x0;
printf("%p",pointer); // 000000C2628FEFE4
GetFromMap(pointer);
printf("%p",pointer); // 000000C2628FEFE4

在调试中,我看到函数内部指针的值发生了变化。

【问题讨论】:

看看这个答案是否有帮助:***.com/a/4426487/6610379 【参考方案1】:

注意lpBuffer = malloc(12) 只是改变了局部变量lpBuffer 的值,但这对传递给GetFrom 的变量没有影响。要更改调用者变量中指针的值,您需要将指针传递给该指针。

void GetFrom(PVOID *lpBuffer)
  *lpBuffer = malloc(12);
  memset(*lpBuffer, 0, 12);
  printf("%p",*lpBuffer); // !=0x0


PVOID pointer = 0x0;
GetFromMap(&pointer);
printf("%p",pointer); // should be != 0x0

顺便说一句:你可以使用calloc,而不是malloc 和后续的memset to 0,它隐式地用0 填充分配的内存-

【讨论】:

【参考方案2】:

在函数内部我改变了它 -> 它已经改变了。

不完全是:发生变化的“它”是指针的副本,而不是原来传递的指针。

但是在函数调用之前的输出是一样的。指针没有改变。

那是因为你更改了一个副本,而指针却保留了原来的值。

就解决这种情况而言,您在 C 中有一个选项,在 C++ 中有两个选项:

在 C 中,将指针传递给指针。这将使您的函数更改传递给它的指针 在 C++ 中,您还可以传递对指针的引用。这将产生相同的行为,而无需显式使用取消引用运算符。

【讨论】:

以上是关于为啥传递给函数的指针的值没有改变? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥通过指针分配给常量没有效果? [复制]

为啥我的值在运行我的函数后没有改变? [复制]

值传递,指针传递;引用传递(c++独有)本质

当需要一个形式参数直接改变对应实参的值时,该形式参数应说明为啥参数?

退出此函数后,为什么指针变量的值没有传递给指针参数?

形参不能改变实参,为啥在用指针传递数值的时候又可以改变呢?