内存分配功能

时间:2013-04-16 22:09:37

标签: c

函数pba应该为pointers变量分配arr中低于arr中所有其他人的平均值的指针。

这是作业 - 虽然我没有实现这个问题,但我确实觉得这些东西对我来说并不是很明显 我的问题

  1. 如何在函数(而非外部)中分配内存
  2. 我的分配好吗?我注意到,如果我将malloc行更改为类似pointers = (int **)malloc(sizeof(int*)*2);的内容,它仍然可以正常工作,但pointers = (int **)malloc(sizeof(int*));将无效,所以我想我有一些问题需要了解大小应该是什么第一名
  3. 我调试了它,似乎一旦我离开函数就无法访问内存,而且它对我来说没有意义,因为它在堆内存中。

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

2 个答案:

答案 0 :(得分:0)

实际上,您正在一个函数内部分配堆内存,该函数称为main。您可以在pba函数内部进行分配,但必须返回已分配的值。或者作为返回值,可以使用int**,或者作为函数参数。但在这种情况下,您需要将指针传递给int**而不仅仅是int**。如果不再需要数组,请不要忘记使用free()解除分配!

答案 1 :(得分: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];       
    }
}