Можно ли изменить указатель, возвращенный malloc
При программировании для личного проекта я обнаружил, что когда я передаю указатель на одну функцию, ее значение не может быть изменено. Пример:
...
GString *buf = NULL;
buf = g_string_sized_new(64);
somefunc(buf, filename);
...
а также
void somefunc(GString *buf, gchar *filename)
{
buf = otherfunc(filename); //otherfunc() returns a GString *
}
после просмотра отладчика я заметил, что при выделении памяти для работы буфера buf=0x80b720 и otherfunc() возвращают 0x80b750. Хотя значение буфера не изменилось. Поэтому я хотел бы спросить, знает ли кто-нибудь, почему это происходит, и является ли это общей характеристикой malloc(). Другими словами, если вы передадите указатель, возвращенный вызовом malloc (), функции, сможете ли вы затем изменить это значение внутри или вне тела функции?
1 ответ
Это не имеет ничего общего с malloc
,
Когда вы передаете указатель на функцию, функция получает копию исходного указателя. Он может изменить свою собственную копию указателя, но не может изменить исходный указатель.
Если вы хотите, чтобы он изменил исходный указатель, вам нужно передать ему адрес исходного указателя, который он получит в качестве указателя на указатель.
void somefunc(GString **buf, gchar *filename) {
*buf = otherfunc(filename);
}