【问题标题】:4-dimensional array allocation: access violation4维数组分配:访问冲突
【发布时间】:2012-05-28 15:56:26
【问题描述】:

我写了这段简单的代码来动态分配一个 4 维数组:

#include <stdlib.h>
#include <stdio.h>

int**** alloc() {

    int i,j,k;
    int ****matrix;
    int x,y,z,n_pairs;

    x= 62;
    y= 45;
    z= 28;
    n_pairs = 4;

    matrix = (int ****) malloc(x*sizeof(int***));

    for (i=0; i<x; i++) {
        matrix[i] = (int ***) malloc(y*sizeof(int**));

        if(matrix[i]==NULL)
            return NULL;

        for (j=0; j<y; j++) {
            matrix[i][j] = (int **) malloc(z*sizeof(int*));

            if (matrix[i][j] == NULL)
                return NULL;

            for (k=0; k<n_pairs; k++) {
                matrix[i][j][k] = (int *)calloc(n_pairs,sizeof(int));

                if (matrix[i][j][k] == NULL)
                    return NULL;
            }
        }
    }

    return matrix;
}


void freeMatrix(int ****m) {

    int i,j,k;
    int x,y,z;

    x= 62;
    y= 45;
    z= 28;


    for(i=0; i<x; i++) {
        for(j=0; j<y; j++) {
            for(k=0; k<z; k++) 
                free(m[i][j][k]);

            free(m[i][j]);
        }

        free(m[i]);
    }

    free(m);
}

int main() {

    int i,j,k,h;
    int ****m = NULL;

    m = alloc();

    for(i=0;i<62;i++)
        for(j=0;j<45;j++)
            for(k=0;k<28;k++)
                for(h=0;h<4;h++)
                    printf("%d\t",m[i][j][k][h]);

    system("pause");

    return 0;
}

问题是当我尝试执行此代码时,我会生成Access Violation。 这不是分配/释放多维数组的正确方法吗?如果是,那是什么问题?

【问题讨论】:

  • 请不要将其称为 4D 数组,这只是对这种野兽的模拟。 C 本身具有 N 维数组。它们非常易于使用,您可以避免在这里遇到的部分困难。 int (A*)[4][5][23] = calloc(37 * sizeof *A);

标签: c multidimensional-array matrix allocation


【解决方案1】:

这里有个问题:

        for (k=0; k<n_pairs; k++) { //<----- This should read `k<z'
            matrix[i][j][k] = (int *)calloc(n_pairs,sizeof(int));

您可能打算循环到z,而不是n_pairs

【讨论】:

  • 这么愚蠢的错误...对不起!我会尽快接受你的回答
  • @aix 你也应该尝试一下狙击:-)
【解决方案2】:

如果你制作一个矩阵,正确的方法是分配你需要的所有内存,然后将它向下挖掘。

对于 2.dim

#include <stdlib.h>
#include <stdio.h>

int main(void)
{
  int i;
  int ** matrix;
  int rows = 10;
  int colums =10;


  matrix = (int**)malloc(rows*sizeof(int*));
  matrix[0] = (int*)malloc(rows*colums*sizeof(int));

  for(i =1; i<rows;i++)
    matrix[i] = &matrix[i-1][colums];

  free(matrix[0]);
  free(matrix);
  return 0;
}

这是为了为矩阵提供一个连续的内存区域。这样可以更快

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    • 2018-11-16
    • 2013-06-23
    • 1970-01-01
    相关资源
    最近更新 更多