为什么传递给函数的指针值不会改变?

时间:2017-05-23 20:50:47

标签: c++ c pointers

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

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

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

2 个答案:

答案 0 :(得分: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

BTW:而不是malloc和后续的memset to 0,您可以使用calloc0隐含地填充已分配的内存 -

答案 1 :(得分:0)

  

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

不完全是:已更改的“它”是指针的副本,而不是已传递的原始指针。

  

但是输出与函数调用之前相同。指针没有改变。

那是因为您更改了副本,而指针保留了原始值。

就修复这种情况而言,C语言中有一个选项,C ++中有两个选项:

  • 在C中,将指针传递给指针。这将让你的函数改变传递给它的指针
  • 在C ++中,您还可以传递对指针的引用。这将产生相同的行为,而无需明确使用解引用运算符。