Mem分配器方法的转换无效(C)

时间:2012-03-10 21:24:28

标签: c memory-management type-conversion

我正在尝试完成为类项目编写内存分配器,而不是必要的作业,因为它没有分配,我自己选择了这个项目。

我有两行标记为#1和#2,两行都不起作用并给出不同的错误消息,这里有详细信息。

我收到以下错误消息(针对#1):从类型'int *'

分配类型'size_t * [10]'时出现不兼容的类型

--- OR ---

(针对#2)错误:从类型'size_t **'分配类型'size_t * [10]'时出现不兼容的类型

我无法理解为什么创建一个相同类型的空数组(#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 个答案:

答案 0 :(得分:1)

您的程序开始时会被窃听。您正在指定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)。