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

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

  1. Объявлен массив типа char с именем allocbuf размером ALLOCSIZE.
  2. Выделен статический указатель allocp, указывающий на начало свободного участка памяти в массиве allocbuf.
  3. В функции main() пользователю предлагается ввести количество имен для создания массива имен.
  4. В цикле на основе введенного количества создается массив имен с помощью функции alloc().
  5. Введенные имена сохраняются в элементах массива nameArray.
  6. В цикле на основе введенных имен выводится список имен с помощью функции printf().
  7. В функции alloc() проверяется достаточность свободного участка памяти в массиве allocbuf для выделения запрашиваемого размера n.
  8. Если достаточно, то память выделяется, иначе возвращается 0.
  9. В функции afree() проверяется принадлежит ли передаваемый указатель p участку памяти, выделенному динамически в массиве allocbuf.
  10. Если принадлежит, то указатель allocp устанавливается на начало свободного участка памяти, иначе ничего не делается.

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


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

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

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