gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:58:36 25 4
gpt4 key购买 nike

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

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

我收到以下错误消息(针对#1):从类型“int *”分配给类型“size_t *[10]”时,类型不兼容

--- ---

(对于 #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;
}

感谢您的帮助!

最佳答案

你的程序一开始就有bug。您正在分配 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)。

关于c - Mem 分配器方法的无效转换 (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9650294/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com