2013-04-30 41 views
0

所以我打電話堆排序C.在陣列上使用C數組排序時

我堆排序函數指針的處理是這樣的:

void heapSort(int keys[], int numKeys){ 
... 
int tmp[numKeys]; 
for(int i=0; i<numKeys; i++){ 
    tmp[i] = maxVaue(h); 
    deleteMax(h); 
} 

*keys = tmp; 
} 

我試圖做的是將keys更改爲指向新數組,因爲函數返回類型爲void。有沒有什麼辦法用指針來做到這一點,還是我只需要memcpy這個數組?

+1

數組是不可分配的,你不能在函數外部使用'tmp'(當函數返回時它超出範圍),所以你需要使用'memcpy()'。 – 2013-04-30 04:31:55

+0

好的,謝謝。我只是想知道這是否可能。 – 2013-04-30 04:34:02

回答

3

數組不能直接分配,也不能在函數外部使用tmp,因爲函數返回時超出了範圍。您必須使用memcpy()

2

如果您想要更改keys指向的內容,則必須將其聲明爲int **。並使用顯式動態分配(使用malloc)而不是C99可變長度數組。

1
void heapSort(int **keys, int numKeys){ 
    int tmp = malloc(sizeof(int)*numKeys); 
    ... 
    free(*keys); 
    *keys = tmp; 
} 

int main(){ 
    int *keys = malloc(sizeof(int)*numKeys); 
    ... 
    heapSort(&keys, numKeys) 
}  
+0

請考慮[不是在C](http://stackoverflow.com/a/605858/28169)中投射'malloc()'的返回值。謝謝。 – unwind 2013-04-30 06:37:27

+0

好的,明白吧。感謝您的提醒 – shellfly 2013-04-30 09:18:32