Простой распределитель памяти, выдающий куски массива allocbuf типа char - C (СИ)
Формулировка задачи:
Доброго времени суток. Решил написать программу, чтобы разобраться с массивами указателей - простой распределитель памяти, выдающий куски массива allocbuf типа char. Cостоит из двух функций - char* alloc(int n) и void afree(char *p). Первая возвращает указатель на n последовательно расположенных ячеек типа char из allocbuf, т.е указатель на символьный массив из n эл-тов. При этом указатель char *allocp смещается к след. пустому блоку. Вторая - освобождает память через смещение указателя char *allocp к предыдущему значению. В main в полученные через char* alloc(int n) строки с клавиатуры вводятся имена и указатели на них сохраняются в массиве char* nameArray[10]. Затем имена в цикле выводятся на экран. Проблема в том, что программа пропускает ячейку массива nameArray[0] и не записывает в нее указатель. Подскажите, в чем проблема?
#include <cstdio> #include <strings.h> #include <conio.h> #include <cstdlib> #define ALLOCSIZE 500 static char allocbuf[ALLOCSIZE]; static char *allocp = allocbuf; char* alloc(int n); void afree(char *p); int main(int nArg, char* pszArgs[]) { int n; char* nameArray[10]; printf("Введите кол-во имен - "); scanf("%d", &n); for (int i = 0; i < n; i++) { printf("След. имя\n"); nameArray[i] = alloc(20); gets(nameArray[i]); } printf("Все имена: \n"); for (int i = 0; i < n; ++i) { printf("%d. %s\n",(i+1),nameArray[i]); } getch(); return 0; } char* alloc(int n) { if (allocbuf + ALLOCSIZE - allocp >= n) { allocp += n; return allocp - n; } else return 0; } void afree(char *p) { if (p >= allocbuf && p < allocbuf + ALLOCSIZE) allocp = p; }
Решение задачи: «Простой распределитель памяти, выдающий куски массива allocbuf типа char»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #define ALLOCSIZE 500 static char allocbuf[ALLOCSIZE]; static char *allocp = allocbuf; char* alloc(int n); void afree(char *p); int main(int nArg, char* pszArgs[]) { int n; char* nameArray[10]; printf("Введите кол-во имен - "); scanf("%d%*c", &n); for (int i = 0; i < n; i++) { printf("След. имя\n"); nameArray[i] = alloc(20); gets(nameArray[i]); } printf("Все имена: \n"); for (int i = 0; i < n; ++i) { printf("%d. %s\n",(i+1),nameArray[i]); } return 0; } char* alloc(int n) { if (allocbuf + ALLOCSIZE - allocp >= n) { allocp += n; return allocp - n; } else return 0; } void afree(char *p) { if (p >= allocbuf && p < allocbuf + ALLOCSIZE) allocp = p; }
Объяснение кода листинга программы
- Объявлен массив типа char с именем allocbuf размером ALLOCSIZE.
- Выделен статический указатель allocp, указывающий на начало свободного участка памяти в массиве allocbuf.
- В функции main() пользователю предлагается ввести количество имен для создания массива имен.
- В цикле на основе введенного количества создается массив имен с помощью функции alloc().
- Введенные имена сохраняются в элементах массива nameArray.
- В цикле на основе введенных имен выводится список имен с помощью функции printf().
- В функции alloc() проверяется достаточность свободного участка памяти в массиве allocbuf для выделения запрашиваемого размера n.
- Если достаточно, то память выделяется, иначе возвращается 0.
- В функции afree() проверяется принадлежит ли передаваемый указатель p участку памяти, выделенному динамически в массиве allocbuf.
- Если принадлежит, то указатель allocp устанавливается на начало свободного участка памяти, иначе ничего не делается.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д