我特意在这条线上有点不知所措:
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;
}
答案 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个int
,int 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以获取几何扩展的替代方法,这是该代码正在执行的操作。