我正在尝试完成为类项目编写内存分配器,而不是必要的作业,因为它没有分配,我自己选择了这个项目。
我有两行标记为#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;
}
感谢您的帮助!
答案 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)。