Простейшее использование динамической памяти - C (СИ)

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

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

Здравствуйте. Простой вопрос от новичка, осваивающего динамическую память. Есть программа:
#include <stdlib.h>
 
main() {
    int i=0;
    int n=20;
    char ch;
    char *str1=calloc(1, 1);
    char *str=calloc(n, sizeof(char));
    
    printf("Vvedite stroku");
    printf("\n\n");
    while ((ch=getchar())!='\n') {
        str[i]=ch;
        i++;
 
        if (i==n-5) {//i==n-1
            n++;
            str1=realloc(str, n);
            str=str1;
            printf("%s%s", str, "\n\n");
        }

    }

    printf("%s", str);
    printf("%d", strlen(str));
    getch();
    free(str);
return 0;}
Она должна создавать динамически заполняющуюся строку и просто выводить введённый результат на консоль. Однако при при этом к введёным символам добавляются 10-20 посторонних, как видно на скриншоте вывода, и длина строки тоже, соответственно, увеличивается. Долго экспериментировал, гуглил, но понять, откуда они берутся и где лежат, так и не смог. Добавляя к строке по 1 байту памяти после ввода каждого символа, при странном условии (if (i==n-5)) можно увидеть, что "довесок" прилепляется к строке не при использовании realloc, а только при записи символа в память, им объявленную. До тех пор, пока символы пишутся в первые n байт, объявленных calloc'ом, всё идёт нормально. Аналогичная проблема возникает при записи в память, выделенную malloc'ом. Порыскав в гугле, нашел, что malloc выделяет память, calloc выделяет и инициализирует её пустым массивом, realloc просто выделяет память в дополнение к существующей. То есть проблема возникает при попытке записи символа в не инициализированную память. Отсюда вопрос: как инициализировать память, добавленную realloc'ом? Как переписать программу так, чтобы она работала? Скриншот вывода, демонстрирующий появлние лишних символов:

Решение задачи: «Простейшее использование динамической памяти»

textual
Листинг программы
#include <string.h>
memset(str[i+1], 0, n - i - 1);

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

  1. Включается заголовочный файл , который содержит функции и структуры для работы со строками в C.
  2. Выполняется операция memset, которая заполняет указанный блок памяти нулевыми значениями.
  3. В качестве первого аргумента передается указатель на первый элемент массива str[i+1].
  4. В качестве второго аргумента передается размер блока памяти, который нужно заполнить нулями, в данном случае это n - i - 1.
  5. Третий аргумент 0 указывает, что нужно заполнить память нулями.

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


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

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

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