2013-04-16 62 views
0

函數pba應該分配給pointers變量arr中的指針低於arr中所有其他指針的平均值。功能內存分配

這是功課 - 雖然我沒有與執行這是一個問題,我覺得東西還沒有完全明顯,我 我的我的問題是

  1. 我如何分配內存裏面的功能(而不是外面)?
  2. 我的配置好嗎?我注意到,如果我改變malloc行類似pointers = (int **)malloc(sizeof(int*)*2);它仍然有效,但pointers = (int **)malloc(sizeof(int*));不會那麼努力,我想我有一些問題了解的大小應該是擺在首位什麼

我調試它,看起來內存一旦離開函數就無法訪問,並且它對我來說沒有意義,因爲它在堆內存中。

void main() { 
    int arrSize = 6; 
    int arr[6] = {8,4,2,9,5,4}; 
    int **pointers; 
    int resSize, i; 
    pointers = (int **)malloc(sizeof(int*)*arrSize); 

    pba(arr, 6, pointers, &resSize); 
    for (i = 0 ; i < resSize ; i++) { 
     printf("%d,",*(*pointers + i)); 
    } 
    printf("\n\n"); 
} 

void pba(int* arr, unsigned int size, int ** pointers, int * resSize) { 
    int i,j = 0,sum = 0; 
    double avg; 
    *resSize = 0; 

    for (i = 0 ; i < size ; i++) 
     sum += arr[i]; 

    avg = sum/(double)size; 
    for (i = 0 ; i < size ; i++) { 
     if (arr[i] < avg) 
      pointers[(*resSize)++] = &arr[i];  
    } 
} 
+1

要在底線做什麼? – 0x90

+0

如果將'int **指針'更改爲'int *指針',則代碼將會簡化。 '指針'只需要指向整數變量。 – suspectus

回答

0

實際上你在一個函數裏面分配堆內存,這個函數叫main。您可以在pba函數內分配,但必須返回分配的值。或者作爲返回值,則可以使用int**,或者作爲函數參數。但在這種情況下,您需要將指針傳遞給int**而不僅僅是int**。如果數組不再需要,請不要忘記使用free()來釋放數組!

0

只要使用堆分配和指針指向指針類型...

void main() { 
    ... 
    pba(arr, 6, &pointers, &resSize); 
    ... 
    free(pointers); 
} 


void pba(int* arr, unsigned int size, int ***pointers, int * resSize) { 
    ... 
    *pointers = malloc(sizeof(*pointers)*size); 
    avg = sum/(double)size; 
    for (i = 0 ; i < size ; i++) { 
     if (arr[i] < avg) 
      (*pointers)[(*resSize)++] = &arr[i];  
    } 
}