При вводе двух и более отрицательных элементов массива выводит ошибку

#include <locale.h>
#include <stdlib.h>
void createArray(int* arr, int size) {
    for (int i = 0; i < size; i++) {
        printf("Введите элемент %d -> ", i + 1);
        while (scanf_s("%d", &arr[i]) != 1 || getchar() != ('\n')) {
            printf("Введите элемент %d -> ", i + 1);
            rewind(stdin);
        }
    }
}
void print_arr(int* arr, int size) {
    for (int i = 0; i < size; i++) {
        printf("arr[%d] = %d\n", i + 1, arr[i]);
    }

}
int delete_element_i(int i, int* arr, int* size) {
    for (i; i < (*size); i++) {
        arr[i] = arr[i + 1];
    }
    (*size)--;
    arr = (int*)realloc(*arr, (*size)*sizeof(int));
    
    
}
void serchAndDeleteFElements(int* arr, int* size) {
    for (int i = 0; i < (*size); i++) {
        if (arr[i]<0) {
            delete_element_i(i, arr, size);
          
        }
    }


}
void input_size(int* size) {
    printf("Введите размер массива ");
    while (scanf_s("%d", size) != 1 || getchar() != ('\n') || *size < 1) {
        printf("Введите размер массива ");
        rewind(stdin);
    }
}
int main() {
    setlocale(LC_ALL, "RUS");
    int size = 0;
    input_size(&size);
    int* arr = (int*)malloc((size) * sizeof(int));  //[size];
    createArray(arr, size);
    printf("\nВведенный массив:\n");
    print_arr(arr, size);
    serchAndDeleteFElements(arr, &size);
    printf("\nНовый массив:\n");
    print_arr(arr, size);
    /*free(*arr);*/
    
}


Ответы (1 шт):

Автор решения: AlexGlebe

в функции delete_element_i команда realloc меняет расположение массива в памяти. А вы на изменение указателя не реагируете и не возвращаете новый указатель.
Аргументы меняем на указатель на указатель массива, чтобы в функции main изменение было видно.

void serchAndDeleteFElements(int * * arrp , int* size) {
    for (int i = 0; i < (*size); i++) {
        if ( ( * arrp ) [ i ] < 0 ) {
            delete_element_i(i, arrp , size);

            // важно, так как вы сместили массив
            -- i ;

        }
    }
}

ещё подправляем чуток неправильное смещение данных

void delete_element_i(int i, int * * arrp , int* size) {
    (*size)--;
    for ( ; i < (*size); i++) {
        (*arrp)[i] = (*arrp)[i + 1];
    }
    *arrp = realloc ( *arrp , (*size)*sizeof(int));
}

и в main передаём адрес указателя

serchAndDeleteFElements ( & arr, &size);
..
free (arr);

free(arr) также будет работать после этого.

→ Ссылка