2013-04-30 31 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