1

以下代码无法正常工作。运行程序时出现段错误。我通过 gdb 运行我的程序,发现错误发生在 fillArrays(int**,int) 函数中。

GDB 为 fillArrays(int**,int) 显示以下参数:

fillArrays (arrays=0x0,numArrays=3)

这是我的程序的源代码

#include <stdlib.h> /* malloc and free */

#define MULTIPLIER          1
#define SMALL               10
#define BIG                 20

void allocateSmallArrays(int **arrays,int numArrays) {
    int index,freeIndex;
    int outerIndex,innerIndex;
    arrays = malloc(numArrays*sizeof(int*));
    if(arrays == NULL) {
        printf("out of memory\n");
        exit(1);
    }
    for(index = 0;index < numArrays;index++) {
        arrays[index] = malloc(SMALL*sizeof(int));
        if(arrays[index] == NULL) {
            printf("out of memory\n");
            exit(1);
        }
    }
}

void fillArrays(int **arrays,int numArrays) {
    int outerIndex,innerIndex;
    for(outerIndex = 0;outerIndex < numArrays;outerIndex++) {
        for(innerIndex = 0;innerIndex < SMALL;innerIndex++)
            arrays[outerIndex][innerIndex] = 0;
    }
}

void deallocateSmallArrays(int **arrays,int numArrays) {
    int index;
    for(index = 0;index < numArrays;index++)
        free(arrays[index]);
    free(arrays);
}

int main(void) {
   int numArrays  = (3 * MULTIPLIER);
   int **arrays = 0;

   allocateSmallArrays(arrays,numArrays);
   fillArrays(arrays,numArrays);
   deallocateSmallArrays(arrays,numArrays);

   arrays = 0;

   return 0;
}

我假设由于数组是在 allocateSmallArrays 中分配的,因此通过 fillArrays 传递它会将分配的数组清零,然后在最后一个函数中解除分配。我该怎么做呢?

4

1 回答 1

4

问题是allocateSmallArrays更改了它自己的指针副本arrays。所以结果malloc丢失了,函数完成后,调用者arrays仍然为0。你可以:

  • 传递一个三重指针int ***arrays并执行*arrays您正在执行的所有操作arrays

  • 返回指针而不是 void

A C FAQ处理这个主题。

于 2012-09-06T03:59:21.020 回答