0

この関数は、 内の他のすべてのポインタの平均よりも下にある内のポインタを変数にpba割り当てる必要があります。pointersarrarr

これは宿題です - これを実装することに問題はありませんが、物事が完全に自明ではないように感じます 私の質問は

  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];       
    }
}
4

2 に答える 2

0

実際には、と呼ばれる関数内にヒープメモリを割り当てていますmain。関数内で割り当てることもできますpbaが、割り当てられた値を返す必要があります。または戻り値としてint**、または関数の引数として使用できます。しかし、この場合、ポインタint**だけでなくint**. free()配列が不要になった場合は、忘れずに解放してください。

于 2013-04-16T22:15:51.070 に答える
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];       
    }
}
于 2013-04-16T22:17:23.427 に答える