Все в C передается по значению, поэтому при выполнении присваивания:
v = (int*) realloc(v,n*sizeof(int));
Вы присваиваете новое значение локальной копии переменной v
. Если вы хотите изменить значение самого указателя (в отличие от изменения на что указатель уже указывает), вам нужно будет передать указатель на указатель и разыменовать его один раз для выполнения присваивания, т. Е.
int ModifyPointer( int **v )
{
// error checking and whatnot
*v = realloc(*v,n*sizeof(int));
}
Думайте об этом так; у вас есть указатель p
, который находится по адресу памяти 0xA и указывает на адрес памяти 0xFF. Вы передаете p
функции, и создается копия v
. Копия v
находится по адресу памяти 0x2A, но все еще указывает на адрес памяти 0xFF.
p(0xA) v(0x2A)
| |
\ /
\ /
\ /
0xFF
Итак, когда вы разыменовываете любой указатель, вы в конечном итоге ссылаетесь на один и тот же кусок памяти, , но сами указатели живут в разных местах в памяти . Таким образом, когда вы изменяете значение копии, оно не отражается в оригинале (т. Е. Realloc создает новый указатель в новой ячейке памяти и присваивает его переменной v
, но p
остается без изменений.)