При повторном realloc-е выбивает ошибку - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго дня. Прошу у вас помощи в работе с указателями и перераспределении памяти. Задание простое: Написать ф-цию, которая находит все элементы в массиве, которые не равняются указанному символу. Использовать ф-ции для заполнения и вывода массива. Нужно использовать malloc\realloc для изменения размера массива. При второй итерации цикла do-while в ф-ции main, при вызове realloc (как я понял) происходит сбой и VS открывает это: Возникает проблема на 19-й строке где realloc.
#include "stdafx.h"
#include "conio.h"
#include <stdlib.h>
 
void vvod(int kilkist, char *mas);
void vivod(int kilkist, char *mas);
void poisk(char simvol, int kilkist, char *mas);
 
void main()
{
    int a, k;
    char *massiv = NULL;
 
    do
    {
        printf("Skolko simvolov budet vvedeno? \n");
        scanf("%d", &a);
 
        if ((massiv = (char*)realloc(massiv, sizeof(char) * a)) == NULL) 
            return;
        else
            massiv = (char*)realloc(massiv, sizeof(char) * a); 
 
        printf("\nVvedit massiv: \n");
        vvod(a, massiv);
 
        printf("\nResultat - \n");
        vivod(a, massiv);
 
        printf("\nVvedite simvol dlya poiska:\n");
        char z = _getch();
 
        printf("\nkolichestvo nesovpadeniy:\n");
        poisk(z, a, massiv);
 
        printf("\nDlya vihodu natisnit ESC, abo inshu klavishu shob prodovjity\n"); 
        k = _getch();
 
    } while (k != 27);
 
    free(massiv);
}
 
void vvod(int kilkist, char *mas)
{
    // здесь получаем слово
    char simvol[25];
    scanf_s("%s", simvol);
 
    // а здесь копируем его в ячейку памяти массива через указатель
    for (int i = 0; i < kilkist + 2; i++, mas++) 
    {
        *mas = simvol[i];
    }
}
 
void vivod(int kilkist, char *mas)
{
    // выводим на экран все элементы массива с указателя
    // начиная с 0 заканчивая длинной массива
    for (int i = 0; i < kilkist; i++, mas++)
    {
        printf("%c", *mas);
    }
 
    printf("\n");
}
 
void poisk(char simvol, int kilkist, char *mas)
{
    // перебираем все элементы от 0 до длинны строки
    // выводим элементы что совпали с нужным
 
    for (int i = 0; i < kilkist; i++, mas++)
    {
        if (*mas != simvol)
        {
            printf("%c,", *mas);
        }
    }

}

Решение задачи: «При повторном realloc-е выбивает ошибку»

textual
Листинг программы
#include "stdafx.h"
#include "conio.h"
#include <stdlib.h>
 
void vvod(int kilkist, char *mas);
void vivod(int kilkist, char *mas);
void poisk(char simvol, int kilkist, char *mas);
 
void main()
{
    int a, k;
    char *massiv = (char *) malloc (sizeof(char)*10);
 
    do
    {
        printf("Skolko simvolov budet vvedeno? \n");
        scanf("%d", &a);
 
        if ((massiv = (char*)realloc(massiv, sizeof(char) * a)) == NULL) 
            return; 
 
        printf("\nVvedit massiv: \n");
        vvod(a, massiv);
 
        printf("\nResultat - \n");
        vivod(a, massiv);
 
        printf("\nVvedite simvol dlya poiska:\n");
        char z = _getch();
 
        printf("\nkolichestvo nesovpadeniy:\n");
        poisk(z, a, massiv);
 
        printf("\nDlya vihodu natisnit ESC, abo inshu klavishu shob prodovjity\n"); 
        k = _getch();
 
    } while (k != 27);
 
    free(massiv);
}
 
void vvod(int kilkist, char *mas)
{
    // здесь получаем слово
    char simvol[25];
    scanf_s("%s", simvol);
 
    // а здесь копируем его в указатель на массив
    for (int i = 0; i < kilkist + 2; i++, mas++) 
    {
        *mas = simvol[i];
    }
}
 
void vivod(int kilkist, char *mas)
{
    // выводим на экран все элементы в массиве с указателя
    // начиная с 0 заканчивая длинной массива
    for (int i = 0; i < kilkist; i++, mas++)
    {
        printf("%c", *mas);
    }
 
    printf("\n");
}
 
void poisk(char simvol, int kilkist, char *mas)
{
    // перебираем все элементы от 0 до длинны строки
    // выводим элементы что совпали с нужным
 
    for (int i = 0; i < kilkist; i++, mas++)
    {
        if (*mas != simvol)
        {
            printf("%c,", *mas);
        }
    }
 
 
}

Объяснение кода листинга программы

  1. Объём выделяемой памяти для начального массива составляет 10 символов.
  2. После каждого вызова функции realloc, память под начальным массивом освобождается.
  3. Каждое вводимое слово добавляется в конец массива.
  4. Каждое введённое слово обрабатывается функцией vvod, которая заполняет массив символами, начиная с первого элемента и заканчивая последним, при этом пропуская символы шифта.
  5. Каждое введённое слово обрабатывается функцией vivod, которая выводит на экран все элементы массива, начиная с первого и заканчивая последним.
  6. Каждое введённое слово обрабатывается функцией poisk, которая ищет введённый пользователем символ в массиве и выводит на экран все элементы, которые ему соответствуют.
  7. Если пользователь ввёл символ «Esc», то программа завершается.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.833 из 5
Похожие ответы