Простейшее использование динамической памяти - C (СИ)
Формулировка задачи:
Здравствуйте. Простой вопрос от новичка, осваивающего динамическую память. Есть программа:
Она должна создавать динамически заполняющуюся строку и просто выводить введённый результат на консоль. Однако при при этом к введёным символам добавляются 10-20 посторонних, как видно на скриншоте вывода, и длина строки тоже, соответственно, увеличивается. Долго экспериментировал, гуглил, но понять, откуда они берутся и где лежат, так и не смог. Добавляя к строке по 1 байту памяти после ввода каждого символа, при странном условии (if (i==n-5)) можно увидеть, что "довесок" прилепляется к строке не при использовании realloc, а только при записи символа в память, им объявленную. До тех пор, пока символы пишутся в первые n байт, объявленных calloc'ом, всё идёт нормально. Аналогичная проблема возникает при записи в память, выделенную malloc'ом. Порыскав в гугле, нашел, что malloc выделяет память, calloc выделяет и инициализирует её пустым массивом, realloc просто выделяет память в дополнение к существующей. То есть проблема возникает при попытке записи символа в не инициализированную память. Отсюда вопрос: как инициализировать память, добавленную realloc'ом? Как переписать программу так, чтобы она работала?
Скриншот вывода, демонстрирующий появлние лишних символов:
#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;}
Решение задачи: «Простейшее использование динамической памяти»
textual
Листинг программы
#include <string.h> memset(str[i+1], 0, n - i - 1);
Объяснение кода листинга программы
- Включается заголовочный файл
, который содержит функции и структуры для работы со строками в C. - Выполняется операция
memset
, которая заполняет указанный блок памяти нулевыми значениями. - В качестве первого аргумента передается указатель на первый элемент массива
str[i+1]
. - В качестве второго аргумента передается размер блока памяти, который нужно заполнить нулями, в данном случае это
n - i - 1
. - Третий аргумент
0
указывает, что нужно заполнить память нулями.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д