С Новым годом! Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 30.11.2011
Сообщений: 17
1

Простой распределитель памяти, выдающий куски массива allocbuf типа char

14.07.2013, 21:08. Показов 1728. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Решил написать программу, чтобы разобраться с массивами указателей - простой распределитель памяти, выдающий куски массива 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] и не записывает в нее указатель. Подскажите, в чем проблема?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#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  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.07.2013, 21:08
Ответы с готовыми решениями:

Сколько значений переменных типа char можно записать в динамической памяти на место одной удаленной переменной типа int
Сколько значений переменных типа char можно записать в динамической памяти на место одной удаленной...

В чем отличие двумерного массива типа char от массива указателей на char?
В чем отличие двумерного массива типа char и массива указателей на char ?

Как присвоить значение одного из элементов массива типа char переменной типа int?
С++ начал буквально только что так что буду благодарен за терпение и понимание ) Сразу оговорюсь...

Преобразование массива типа char в массив типа float
Хорош ли следующий способ преобразования массива типа char в массив типа float? #include...

1
349 / 299 / 166
Регистрация: 15.03.2012
Сообщений: 653
Записей в блоге: 1
14.07.2013, 22:52 2
Это scanf() во всём виновата.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#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;
}
2
14.07.2013, 22:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.07.2013, 22:52
Помогаю со студенческими работами здесь

Сформировать массив типа bool из массива типа char
Доброго времени суток! После ввода элементов массива вылазит ошибка &quot;Необработанное исключение:...

Освобождение памяти для динамического масива типа char
Здравствуйте, помогите пожалуйста разобраться с одним моментом. При освобождении памяти двумерного...

Условие типа if( масив типа char[x] [y] != переменная типа char) не срабатывает
Создал функцию ChangeWay(). Все, кроме if(map !=ar) (обе переменные типа char) работает...

Аргумент типа (const char*) несовместим с параметром типа (char*). Как исправить?
#include &quot;Table.h&quot; #include &quot;Contour.h&quot; #include &quot;TwoShape.h&quot; #include &lt;iostream&gt; int...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru