Вызов realloc()
в include()
может переместить блок. Вот почему realloc()
возвращает указатель, чтобы сказать вам, куда он наконец поместил данные. Ваш код временно использует это значение (вы сохраняете его в локальной переменной p
и используете его), но не можете передать его обратно вызывающей стороне. Функция main()
сохраняет в своей локальной переменной ptr
указатель на исходный блок и никогда не меняется.
Помните, что когда вы передаете аргумент функции, функция получает свою собственную копию. Здесь вы передаете содержимое ptr
в качестве аргумента, и include()
видит это значение как переменную с именем p
, но этот p
является только копией ptr
. Изменения p
не видны ptr
.
Вы можете изменить include()
, чтобы он возвращал новый указатель; что-то вроде:
int *include(int d,int* p,int n,int k,int flag)
{
...
return p;
}
, а затем вызвать его с помощью:
ptr = include(digit, ptr, i, koef, 1);
, который является способом передачи нового значения указателя вызывающей стороне.
Примечания:
main()
должен возвращать int
, а не void
.
- Вам не нужно приводить возвращаемое значение
malloc()
или realloc()
. Эти функции возвращают void *
, который компилятор C успешно конвертирует в любой тип указателя без явного преобразования. Явное приведение - это способ сказать компилятору: «заткнись, я знаю, что делаю». Так как в этой ситуации компилятор в любом случае не говорил бы, приведение - просто трата пространства исходного кода. Кроме того, приведение может быть вредным в некоторых ситуациях, когда компилятор будет громко предупреждать: если malloc()
введен с ошибкой, компилятор предположит, что он возвращает int
, и предупредит об использовании int
в качестве указателя; но актеры предотвратят это предупреждение.
- Ваш код не компилируется, есть дополнительная закрывающая скобка.