При вводе двух и более отрицательных элементов массива выводит ошибку
#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) также будет работать после этого.