Ваша программа прослушивается с самого начала.Вы назначаете 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) для всех операций с памятью.