Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Ошибка realloc(): invalid pointer

NicoliHanth Ученик (158), открыт 1 неделю назад
пытаюсь увеличить размер массива с помощью realloc, но выдает такую ошибку. функция malloc ранее появлялась в коде, а free не использовалась. в чем может быть проблема?
2 ответа
Лайт Ягами Искусственный Интеллект (309467) 1 неделю назад
Ты неправильно работаешь с указателем, тебе в функции initialize указатель надо передавать по ссылке, а не по значению, т.е. передавать указатель на указатель. И в функции insert то же самое, указатель меняется, тоже нужно это учитывать (тоже передавать по ссылке, а не по значению).
Николай ВеселухаВысший разум (368762) 1 неделю назад
В чистом C ссылок нет.
Лайт Ягами Искусственный Интеллект (309467) Николай Веселуха, а, тогда указатель на указатель передавать автору придётся
Николай Веселуха Высший разум (368762) 1 неделю назад
#include <stdio.h>
#include <stdlib.h>

int* create(int* ptr, size_t len) { // указатель ptr – локальная переменная на стеке
ptr = (int*)malloc(len * sizeof(int));
return ptr; // если его не вернуть, то он при завершении функции будет удалён
}

void fill(int* ptr, size_t len) {
size_t i = 0;
if (ptr == NULL || len == 0) return;
printf("Input elements: ");
while (i < len) {
scanf("%i", &ptr[i]);
++i;
}
}

void copy(int* dest, int* src, size_t len) {
size_t i = 0;
if (dest == NULL || src == NULL || len == 0) return;
while (i < len) {
dest[i] = src[i];
++i;
}
}

int* push_back(int value, int* ptr, size_t* len) { // и здесь обязательно возвращаем свой указатель
if (ptr != NULL) {
int* tmp = create(ptr, *len + 1); // здесь другая область видимости
if (tmp == NULL) return ptr;
copy(tmp, ptr, *len);
tmp[*len] = value;
*len += 1;
free(ptr);
ptr = NULL; // после вызова free инициализация обязательна
ptr = create(ptr, *len);
copy(ptr, tmp, *len);
free(tmp);
} else {
ptr = create(ptr, 1);
if (ptr != NULL) {
*len = 1;
ptr[0] = value;
}
return ptr;
}
return ptr; // вернуть здесь указатель tmp вместо ptr, значит допустить утечку памяти
}

void show(int* ptr, size_t len) {
size_t i = 0;
if (ptr == NULL || len == 0) return;
printf("Output elements: ");
while (i < len) {
printf("%d ", ptr[i]);
++i;
}
putchar('\n');
}

int main(void) {
size_t len = 0;
int* arr = NULL; // Если в этой области видимости вы выделили память...
int value;
printf("Input length: ");
scanf("%zu", &len);
arr = create(arr, len); // Выделение памяти в этой области видимости
fill(arr, len);
show(arr, len);
printf("Input value: ");
scanf("%i", &value);
arr = push_back(value, arr, &len); // Повторное выделение памяти
show(arr, len);
free(arr); // ...то в этой же области и обязаны её освободить!
}
Похожие вопросы