Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Steelandrew
1 / 8 / 0
Регистрация: 03.02.2015
Сообщений: 85
1

Саморасширяющийся массив, динамическая память

04.06.2018, 19:43. Просмотров 346. Ответов 5
Метки нет (Все метки)

Пытаюсь освоить динамическую память, попробовал написать программу, в которой бы ввод данных записывался в саморасширяющийся массив с динамической памятью. Вроде написал, но программа работает только с небольшим фрагментом текста, если ввожу много текста, то выскакивает исключение. Подскажите что не так в коде:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//Программа записывает ввод данных в массив с динамической саморасширяющейся памятью
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int main()
{
    setlocale(LC_ALL, "RUS");
    char *a = NULL, i = 0, elem;
    char c;
    
    printf("Введите данные:\n");
    while ((c=getchar())!=EOF) {
        elem = c;
        a = (char*)realloc(a, (i + 1) * sizeof(char));
        a[i] = elem; //тут вылетает исключение и красная точка при большом кол-ве введенных символов
        i++;
        }
    for (int j = 0; j < i; j++)
        printf("%c", a[j]);
    printf("Работа программы завершена, нажмите любую клавишу.");
    _getch();
    free(a);
    return 0;
}
Добавлено через 2 часа 0 минут
может быть просто слишком неоптимизированный, ресурсоёмкий процесс получается, поэтому всплывает исключение
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.06.2018, 19:43
Ответы с готовыми решениями:

Одномерный массив.Динамическая память
b) Динамическая память. Одномерный массив. Дан массив целых чисел. Поменять местами все значение...

Динамическая память
Ребятки-котятки, помогите пожалуйста, как сделать так, чтобы Массив представлялся указателем на...

Динамическая память
Есть вот такой код: struct MyStruct { int* i; int size; } typedef struct MyStruct...

Динамическая память
Помогите решить задание с динамикой. Идей никаких нету. Разработать программу вычисления...

Динамическая память. Массивы
Есть массив А. Нужно сформулировать новый массив Б с индексов положительный элементов массива А. Я...

5
CoderHuligan
813 / 539 / 201
Регистрация: 30.06.2015
Сообщений: 2,997
Записей в блоге: 13
05.06.2018, 13:00 2
Цитата Сообщение от Steelandrew Посмотреть сообщение
может быть просто слишком неоптимизированный, ресурсоёмкий процесс получается, поэтому всплывает исключение
Так должно сработать:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int main(void)
{
    setlocale(LC_ALL, "Ru");
    char *a = NULL, i = 0, elem, *temp;
    char c;
    printf("Введите данные:\n");
    while ((c=getchar())!=EOF) 
    {
        elem = c;
        if((temp = (char*)realloc(a, (i + 1) * sizeof(char)))!=NULL)a=temp;
        else {puts("Error!"); return -1;}//правильно через временную переменную!!!
        a[i] = elem;
        i++;
    }
    a[i]='\0';//не забываем о терминальном нуле!!!
    printf("%s", a);
    printf("\nРабота программы завершена, нажмите любую клавишу.");
    //_getch();
    free(a);
    return 0;
}
0
Steelandrew
1 / 8 / 0
Регистрация: 03.02.2015
Сообщений: 85
05.06.2018, 22:19  [ТС] 3
CoderHuligan, не, ошибку выдаёт, то ли памяти не хватает то ли чего.
0
stake-k26
618 / 432 / 332
Регистрация: 25.04.2016
Сообщений: 1,218
05.06.2018, 22:41 4
Максимальный объем строки - 4 Мб! Контролируется значением int MAX_LEN = 2048; в функции getstring(). Хотите 8 мб? Ставьте 4096 и т.д.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <stdio.h>      //предоставляет: fgetc, stdin, printf, puts
#include <stdlib.h>     //sizeof, free, realloc, malloc
#include <string.h>     //strncpy
 
char* getstring (void)
{
    char* buffer = NULL;                    //буфер для хранения символов
    unsigned int capacity = 0;              //размер буфера
    unsigned int n = 0;                     //сколько символов в буфере
    int bitofchar = sizeof(char);           //сколько бит в одном char
    int MAX_LEN = 2048;                     //1 строка максимум 4 Мб (MAX_LEN*2)
    int c;                                  //сюда записываем символы
 
    // получаем символы
    while ((c = fgetc(stdin)) != '\n' && c != EOF)
    {
        if (n + 1 > capacity)               //проверяем размер буфера
        {
            if (!capacity) capacity = 32;   //по умолчанию 32 символа
            else if (capacity <= MAX_LEN) capacity *= 2;
            else                            //угроза переполнения буфера
            {
                free(buffer);
                return NULL;
            }
            // меняем размер буфера в памяти
            char* temp = (char*) realloc(buffer, capacity * bitofchar);
            if (temp == NULL)
            {
                free(buffer);
                return NULL;
            }
            buffer = temp;
        }
        // заносим символ в буфер
        buffer[n++] = c;
    }
    if (n == 0 && c == EOF) return NULL;        //если пустая строка, вернем NULL
 
    // минимизируем размер буфера
    char* minimal = (char*) malloc((n + 1) * bitofchar);
    strncpy(minimal, buffer, n);
    free(buffer);                               //освобождаем память
    minimal[n] = '\0';                          //добавляем конец строки
 
    return minimal;                             //возвращаем получившуюся строку
}
 
int main (void)
{
    char * string = NULL;                       //указатель на будущую строку
    printf("Input string, please:\n");
    if ((string = getstring()) == NULL)         // ввод символов с клавиатуры
        return 0;
    printf("\nYour string is:\n");
    puts(string);       // выводим строку на экран
    free(string);       // освобождаем память, занятую строкой
    return 0;
}
0
CoderHuligan
813 / 539 / 201
Регистрация: 30.06.2015
Сообщений: 2,997
Записей в блоге: 13
06.06.2018, 14:27 5
Цитата Сообщение от Steelandrew Посмотреть сообщение
не, ошибку выдаёт, то ли памяти не хватает то ли чего.
там у ещё надо допольнительно выделить память под терминальный нуль после цикла. забыл, и никто не заметил и не поправил. Кстати сообщите какой компилятор используете, это многое прояснит..
0
Steelandrew
1 / 8 / 0
Регистрация: 03.02.2015
Сообщений: 85
07.06.2018, 23:34  [ТС] 6
mvs
0
07.06.2018, 23:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.06.2018, 23:34

Динамическая память и структуры
не получается считать данные из stdin есть структура: typedef struct { char name; int...

Указатели и динамическая память
1. Создать массив с использованием указателя. Заполнить созданный массив значениями согласно...

Динамическая память выделение и очистка
Здравствуйте ) помогите разобраться нашёл на сайте простенькую программку, которая сначала выделяет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru