可以更改malloc返回的指针

use*_*288 1 c malloc gstring

在为个人项目编程时,我发现当我将指针传递给一个函数时,它的值无法更改.例:

...
GString *buf = NULL;
buf = g_string_sized_new(64);
somefunc(buf, filename);
...
Run Code Online (Sandbox Code Playgroud)

void somefunc(GString *buf, gchar *filename)
{
    buf = otherfunc(filename); //otherfunc() returns a GString *
}
Run Code Online (Sandbox Code Playgroud)

在观察调试器后我观察到当缓冲区内存分配运行时,则buf = 0x80b720和otherfunc()返回0x80b750.虽然缓冲区的值没有变化.所以我想问一下是否有人知道为什么会发生这种情况,以及这是否是malloc()的一般特征.换句话说,如果将malloc()调用返回的指针传递给函数,那么您是否可以在函数体内部或外部更改此值?

Jer*_*fin 8

这与此无关malloc.

将指针传递给函数时,函数会收到原始指针的副本.它可以修改自己的指针副本,但不能修改原始指针.

如果你想要它修改原始指针,你需要传递原始指针的地址,它将作为指针的指针接收.

void somefunc(GString **buf, gchar *filename) { 
    *buf = otherfunc(filename);
}
Run Code Online (Sandbox Code Playgroud)

  • 我想补充一点,传递指向函数的指针与将整数传递给函数几乎相同,只是整数恰好是一个内存地址. (4认同)
  • 我还想指出,在函数内部更改buf的值可能会导致内存泄漏(因为现在你无法释放最初分配的内存) (2认同)