При повторном 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);
}
}
}
Объяснение кода листинга программы
- Объём выделяемой памяти для начального массива составляет 10 символов.
- После каждого вызова функции realloc, память под начальным массивом освобождается.
- Каждое вводимое слово добавляется в конец массива.
- Каждое введённое слово обрабатывается функцией vvod, которая заполняет массив символами, начиная с первого элемента и заканчивая последним, при этом пропуская символы шифта.
- Каждое введённое слово обрабатывается функцией vivod, которая выводит на экран все элементы массива, начиная с первого и заканчивая последним.
- Каждое введённое слово обрабатывается функцией poisk, которая ищет введённый пользователем символ в массиве и выводит на экран все элементы, которые ему соответствуют.
- Если пользователь ввёл символ «Esc», то программа завершается.