【问题标题】:Invalid Conversion for Mem Allocator Method (C)内存分配器方法(C)的无效转换
【发布时间】:2012-03-10 21:24:28
【问题描述】:

我正在尝试为一个班级项目编写一个内存分配器,因为没有分配,所以没有必要的作业,我自己选择了这个项目。

我有两行标记为 #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;
}

感谢您的帮助!

【问题讨论】:

  • 您的代码没有意义:oldArray 的类型为 size_t *(指向 size_t 的指针),FREE_ARRAY 的类型为 size_t * [10](十指向size_t)。一个是柠檬,一个是比萨,你不能把它们混合成奶昔。
  • 知道如何完成我想做的事情吗?您是否引用 [10] 是因为两个数组的大小必须为 10 才能相互设置?
  • 您需要使用正确的类型,了解数组的工作原理,并且可能了解动态内存分配和管理。对于一个 SO 问题来说,这是一个相当高的要求,而且我想说,一本好的 C 教科书也没有涵盖任何内容。通过结构化阅读而不是直接跳到中间,您可能会更好地了解这一点。

标签: c memory-management type-conversion


【解决方案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)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    相关资源
    最近更新 更多