Неверное преобразование для метода Mem Allocator - PullRequest
0 голосов
/ 11 марта 2012

Я пытаюсь закончить написание распределителя памяти для проекта класса, нет необходимости делать домашнее задание, так как оно не было назначено, я сам выбрал этот проект.

У меня есть две строки, помеченные # 1 и # 2, обе не работают и выдают разные сообщения об ошибках, вот подробности.

Я получаю следующее сообщение об ошибке (для # 1) : несовместимые типы при назначении типу «size_t * [10]» типа «int *»

--- ИЛИ ---

(для # 2) ошибка: несовместимые типы при назначении типу "size_t * [10]" из типа "size_t **"

Я не могу понять, почему создание пустого массива того же типа (# 2) все еще не может выполнить "преобразование". Если оба массива имеют тип size_t *, почему я получаю второе сообщение об ошибке при попытке установить FREE_ARRAY в новый массив?

void expandArray(void) 
{
    //size_t* FREE_ARRAY[10]; #This is how FREE_ARRAY is declared.

    size_t* oldArray = FREE_ARRAY;
    int newArray[freeArraySize*2]; #1
    //size_t* newArray[freeArraySize*2]; #2

    FREE_ARRAY = newArray;

    int i = 0;
    for (i=0; i<freeArraySize; i++) 
    {
        FREE_ARRAY[i] = oldArray[i];
    }

    for (i=freeArraySize; i<(freeArraySize*2); i++) 
    {
        FREE_ARRAY[i] = (size_t)NULL;
    }

    freeArraySize = freeArraySize*2;
}

Спасибо за любую помощь!

1 Ответ

1 голос
/ 11 марта 2012

Ваша программа прослушивается с самого начала.Вы назначаете FREE_ARRAY (который, вероятно, является глобальной переменной), чтобы указывать на переменную стека из функции.Даже если вы решите проблему компиляции с помощью соответствующего оператора приведения, эта память будет повреждена очень скоро после того, как вернут expandArray.

Кроме того, вам не нужно писать цикл for для копирования памяти из старого массивав новое.Просто используйте функцию memcpy ().

Вот что вы хотите сделать:

typedef unsigned char BUFFER_TYPE;
BUFFER_TYPE* FREE_ARRAY = NULL;
size_t freeArraySize = 0;
size_t INITIAL_SIZE = 100;

void expandArray()
{
    BUFFER_TYPE* newBuffer = NULL;
    size_t newSize = 0;
    size_t oldSize = 0;

    if ((freeArraySize == 0) || (FREE_ARRAY == NULL))
    {
        newSize = INITIAL_SIZE;
    }
    else
    {
        newSize = freeArraySize * 2;
        oldSize = freeArraySize;
    }

    // allocate the new array
    newBuffer = (BUFFER_TYPE*)malloc(newSize*sizeof(BUFFER_TYPE));

    if (FREE_ARRAY != NULL)
    {
        // copy the contents of the old array into the new array.
        memcpy(newBuffer, FREE_ARRAY, oldSize*sizeof(BUFFER_TYPE));

    }

    // zero out the extra contents
    memset(newBuffer+oldSize, '\0', (newSize-oldSize)*sizeof(BUFFER_TYPE));


    // make FREE_ARRAY point to the new allocation
    freeArraySize = newSize;
    FREE_ARRAY = newBuffer;
    free(FREE_ARRAY); // ok if FREE_ARRAY is NULL
}

Я не знал, хотите ли вы, чтобы ваш буфер памяти был в байтах илиэкземпляры "size_t" (как предполагает ваша оригинальная реализация).Поэтому я только что объявил массив типа BUFFER_TYPE.Вы можете изменить typedef, чтобы сделать массив любым типом, который вы хотите.Функция expandArray будет по-прежнему работать, поскольку она учитывает sizeof (BUFFER_TYPE) для всех операций с памятью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...