При повторном 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», то программа завершается.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д