优先级队列的这段C代码如何工作?

时间:2012-03-05 05:55:24

标签: c

我特意在这条线上有点不知所措:

 Entry** newHeap = (Entry**)malloc(sizeof(Entry*) * newHeapLength);

在此代码中:

 /**
     * Expands the heap array of the given priority queue by 
     *   replacing it with another that is double its size.
     *
     * @param  pq  the priority queue whose heap is to be doubled in size
     * return  1 for successful expansion or an error code:
     */
    int expandHeap (PriorityQueue *pq)
    {
        int returnCode = 1;
        int newHeapLength = pq->heapLength * 2;
        Entry** newHeap = (Entry**)malloc(sizeof(Entry*) * newHeapLength);
        if (newHeap != NULL) 
        {
            int index;
            for (index = 0; index < pq->heapLength; index++) 
            {
                newHeap[index] = pq->heap[index];
            }
            free(pq->heap);
            pq->heap = newHeap;
            pq->heapLength = newHeapLength;
        }
        else
        {
            returnCode = -1;  // TODO: make meaningful error codes
        }
        return returnCode;
    }

2 个答案:

答案 0 :(得分:2)

Entry** newHeap = (Entry**)malloc(sizeof(Entry*) * newHeapLength);
      |                      |
newHeap is a             malloc allocates a chunk in memory that is the size of 
pointer to a             a pointer to an Entry times newHeapLength
pointer to an Entry

答案 1 :(得分:1)

它只是在运行时为您分配一个数组。通常,必须在编译时指定数组的大小。但是这里是在运行时指定的,它是newHeapLength。该数组中的每个条目(“单元格”)必须能够在其中存储类型Entry*的值。在C中,数组是连续的,因此数组的总大小(以字节为单位)只是两个数字的乘积:sizeof(Entry*) * newHeapLength。现在newHeap可用于以通常的方式处理此数组:例如newHeap[8]。当然,如果8 >= newHeapLength,这将是过去分配的区域, bad

对于存储10个intint ia[10];的数组,ia的类型为int *更正:差不多。但我们可以假装它是,出于解释的目的)。这里,类似地,对于存储类型Entry*的值的数组,类型是(Entry*)*。简单。 :)

当然,您必须将malloc的返回值强制转换为您的类型,以便能够使用它来处理该数组。 malloc本身会返回void*的地址。含义。它所指向的存储单元的大小,被宣告为 unknown 。当我们说ia的类型为int*时,我们实际上说的是它指向的内存单元的大小为sizeof(int)。因此,当我们撰写ia[3]时,它实际上已翻译为*(ia+3),实际上是*(int*)(void*)( (unsigned int)(void*)ia + 3*sizeof(int) )。换句话说,编译器只将sizeof(int)三次添加到起始地址,从而“跳过”三个sizeof(int) - 宽的内存单元。对于newHeap[8],它只会“跳”到8 sizeof(Entry*)个宽的内存单元格,以获取该数组中第9个条目的地址(从1开始计算)。

另外,请参阅hashed array tree以获取几何扩展的替代方法,这是该代码正在执行的操作。