2

我有一个项目,我在 C 中创建了几个动态的二维整数数组。

我试图通过创建一个 mallocateArray 函数来减少冗余代码。我可以让它在没有这个功能的情况下工作。

问题是指针可能很麻烦,由于某种原因,当我尝试使用此方法时,我只是遇到了一个段错误:

这是我得到的:

     void mallocateArray(int ***array, int *row, int *col){
     //allocate storage for the array of ints:
         *array = (int**)malloc(*row * sizeof(int *));
         int i;
         for (i = 0; i < *row; i++){
            *array[i] = (int*)malloc(*col * sizeof(int));
         }
     }

这是我的数组的定义方式:

     int **matrix1,
     int row = 2
     int col = 3

     mallocateArray(&matrix1, &row, &col);

当我运行它时,我得到一个段错误。所以目前我只是不使用该方法并处理冗余。我曾尝试通过取消引用等来弄乱指针,但我似乎无法弄清楚。

我希望你们能帮助我。

这是我的主要方法中有效的代码示例:

      result = (int**)malloc(row1 * sizeof(int *));
int i;
for (i = 0; i < row1; i++){
    result[i] = (int*)malloc(col2 * sizeof(int));
}
4

2 回答 2

6

你很近。只是少了一些括号。这一行:

*array[i] = (int*)malloc(*col * sizeof(int));

应该:

(*array)[i] = malloc(*col * sizeof(int));

注意这些操作顺序!我也去掉了你不必要的演员表。

如果您只是按值传递row,您的函数看起来会不那么复杂。col例子:

void mallocateArray(int ***array, int row, int col)
{
    *array = malloc(row * sizeof(int *));
    for (int i = 0; i < row; i++){
       (*array)[i] = malloc(col * sizeof(int));
    }
}
于 2013-03-13T01:17:55.303 回答
4

您正在分配数组数组。这是一个有趣的专业提示 - 您可以将已知维度的二维数组压缩成一维数组!要将 (x,y) 索引转换为单维索引,请使用以下命令:i = (x + y * cols)

这样做将允许您为阵列生成单个连续的内存板,而不是本质上的内存块列表。尝试使用 malloc(sizeof(int) * row * column) 并公开数组访问,如上所述。

这将减少取消引用列的需要并提供(小但存在的)性能提升。

于 2013-03-13T01:18:29.907 回答