Простой распределитель памяти, выдающий куски массива 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 устанавливается на начало свободного участка памяти, иначе ничего не делается.