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

标签 c memory-management type-conversion

我正在尝试为一个类(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/

相关文章:

c# - Linq 查询转换为 List<string>

c - 在 C 中通过引用传递不起作用

我可以在包含的代码中设置断点吗?

linux - WHM/Cpanel 和 Linux 中内存使用的不同

c# - 对传入数据包进行高效的多种类型检查

c# - 将 byte[] 转换为字符串并再次返回

C 编程 strchr 返回指针

c - 警告 : assignment from incompatible pointer type [enabled by default] and cast to pointer from integer of different size [-Wint-to-pointer-cast]

c - 如何在C中连接字节数组

java 清除内部内存缓存