【问题标题】: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

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

【问题讨论】:

标签: c++ c pointers


【解决方案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++ 中,您还可以传递对指针的引用。这将产生相同的行为,而无需显式使用取消引用运算符。

    【讨论】:

      猜你喜欢
      • 2018-06-02
      • 2020-11-16
      • 1970-01-01
      • 2021-01-22
      • 2022-07-05
      • 2023-03-06
      • 2012-12-05
      • 2023-03-23
      • 1970-01-01
      相关资源
      最近更新 更多