У вас есть несколько ошибок в коде:
В main
вы объявляете p
как массив, который находится в стеке. Вещи, которые находятся в стеке, не могут быть позже изменены.
Затем в foo
вы хотите изменить p
, чтобы указывать на память из кучи, а не на объявленный вами массив.
То, чего вы хотите достичь, можно сделать, сначала выделив p
с помощью malloc
, а затем снова перераспределив эту память с помощью realloc
:
void foo (char **p) {
*p = realloc(*p, 4);
}
int main (void) {
char *p = malloc(2);
foo(&p);
...
}
Обратите внимание, что аргумент foo
является двойным указателем. Это связано с тем, что realloc может не только изменять размер блока памяти, но и фактически перемещать его, что влияет на значение указателя.
Также обратите внимание, что вторым аргументом realloc
является не размер, который вы хотите увеличить, а текущий размер блока плюс размер, на который нужно увеличить.