Да, он действительно жалуется, потому что void *
, который вы передаете как mem
, является копией указателя. Изменения указателя внутри функции будут не отражаться обратно на main
.
Если вы хотите изменить mem
в функции и отразить его обратно, вам нужно передать указатель на указатель.
Следующий код иллюстрирует это:
#include <stdio.h>
#include <stdlib.h>
static void fn (void *p1, void **p2) {
p1 = realloc(p1, 200);
*p2 = realloc (*p2, 200);
printf (" In call: %p %p\n", p1, *p2);
}
int main (void) {
void *x1 = malloc (100);
void *x2 = malloc (100);
printf ("Before call: %p %p\n", x1, x2);
fn (x1, &x2);
printf (" After call: %p %p\n", x1, x2);
return 0;
}
который выводит:
Before call: 0x896f008 0x896f070
In call: 0x896f0d8 0x896f1a8
After call: 0x896f008 0x896f1a8
^
+--- Note this bit.
и вы можете видеть, что первое значение сохраняется в main
несмотря на то, что оно было изменено в функции.