2012-05-28 51 views
3

我寫這個簡單的代碼動態地分配4維數組: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此代碼的結果時,我試圖執行它。 是不是分配/釋放多維數組的正確方法?如果是,那麼問題是什麼?

+0

請不要稱這是一個4D陣列,這只是一個這樣的野獸模擬。 C本身具有N維數組。它們非常易於使用,避免了您在此遇到的部分困難。 'int(A *)[4] [5] [23] = calloc(37 * sizeof * A);' –

回答

4

的一個問題是在這裏:

 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

+0

這樣一個愚蠢的錯誤......我很抱歉!我會盡快接受你的回答 – user1372813

+2

@aix你應該也可以在狙擊中做一下:-) –

0

如果你製作一個矩陣,正確的方法是分配你需要的所有內存,然後將其劃分。

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

這是對於具有繼續存儲區域用於基質。這可以更快