0

该函数pba应将低于所有其他指针平均值pointers的指针分配给变量。arrarr

这是家庭作业 - 虽然我在实施这个方面没有问题,但我确实觉得这些东西对我来说并不完全显而易见 我的问题是

  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 回答