Ошибка сегментации в репликации malloc - PullRequest
0 голосов
/ 26 августа 2018

Я пытаюсь реализовать пример из книги Язык программирования C .Пример реплицирует упрощенную версию malloc .Моя реализация вызывает ошибку сегментации.Функции alloc и afree в основном скопированы из книги.Я пытаюсь использовать эти функции в основном.Насколько я понял, выражение * (pointer + i) дает мне значение, хранящееся в адресе рядом с указателем, если оба адреса находятся в одном массиве.Это должно быть неявно удовлетворено, но, очевидно, этого недостаточно.

Как я могу фактически использовать функции alloc и afree для создания динамического массива?

#include <stdio.h>

int *alloc(int);
void afree(int *);

/* RETURNS SEGMENTATION FAULT, WHY? */
int main()
{
    int *dyna_arr;

    dyna_arr = alloc(50);

    /* fill the array with integers */
    for (int i = 0; i < 50; i++)
    {
        *(dyna_arr+i) = i;
    }

    for (int i=49; i>=0;i--)
    {
        printf(" %d", *(dyna_arr+i));
    }

    afree(dyna_arr);
}

#define ALLOCSIZE 10000

static int allocbuf[ALLOCSIZE];
static int  *allocp =allocbuf;  /* next free position in buffer  */

/* alloc: return pointer to n ints */
int *alloc(int n)
{
    if (allocbuf + ALLOCSIZE - allocp >= n) /* is there enough space in the buffer? */
    {
        allocp += n;
        return allocp - n;
    }
    else /* not enough space */
    {
        return 0;
    } 
}

/* afree: free the storage pointed to by p */
/*        Only possible in LIFO fashion */
void afree(int *p)
{
    if (p >= allocbuf && p < allocbuf + ALLOCSIZE)
    {
        allocp = p;
    }
}

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Проблема в

if (allocbuf + ALLOCSIZE - allocp <= n) /* is there enough space in the buffer? */

Ваше сравнение неверно.Это должно быть available memory >= n, но ваша проверка if available memory <= n и возврат 0;

Ниже модификация должна работать

if (((allocbuf + ALLOCSIZE) - allocp) >= n) /* is there enough space in the buffer? */
0 голосов
/ 26 августа 2018

Ваша проблема в alloc(50);, которая дает вам 50 байтов памяти, а не место для 50 int.Вам нужно использовать alloc(50*sizeof(int));.

...