2011-04-25 148 views
3

我正在寫一個函數將存儲分配給nxn矩陣。分配存儲到矩陣

void assign_matrix_storage(double **matrix, int n){ 
    if((matrix = malloc(n * sizeof(double*))) == NULL){ 
     printf("ERROR: Memory allocation failed\n"); 
     exit(EXIT_FAILURE); 
    } 

    int i; 
    for(i = 0; i < n; i++){ 
     if((matrix[i] = malloc(n * sizeof(double))) == NULL){ 
      printf("ERROR: Memory allocation failed\n"); 
      exit(EXIT_FAILURE); 
     } 
    } 

    return; 
} 

但是,如果我運行下面的代碼,我得到的最後一個語句段錯誤:

double **A; 
assign_matrix_storage(A, 2); 
A[1][1] = 42; 

這是爲什麼?

+0

http://stackoverflow.com/questions/16004668/c-allocating-a-matrix-in-a-function/27366086#27366086 上面你會發現,我與功能分配做了一個程序並以任何可能的方式處理矩陣C(g​​cc C11/C99)。也許這對你有用...... – 42n4 2014-12-08 20:25:08

回答

3

您已經分配的內存爲您的矩陣(完美),但你實際上並沒有將其分配給被叫方的A變量。相反,A最終仍未初始化,並試圖分配給A[1][1]導致段錯誤。爲了做到這一點,您需要一個指向該變量的指針並將矩陣分配給該地址。因此,實際上,你的函數簽名和實施將需要改變:

/* take a pointer to a (double **) */ 
void assign_matrix_storage(double ***matrix, int n){ 
    /* then all accesses need to dereference first */ 
    if(((*matrix) = malloc(n * sizeof(double*))) == NULL){ 
     printf("ERROR: Memory allocation failed\n"); 
     exit(EXIT_FAILURE); 
    } 

    int i; 
    for(i = 0; i < n; i++){ 
     if(((*matrix)[i] = malloc(n * sizeof(double))) == NULL){ 
      printf("ERROR: Memory allocation failed\n"); 
      exit(EXIT_FAILURE); 
     } 
    } 

    return; 
} 

/* then call */ 
double **A; 
assign_matrix_storage(&A, 2); 
A[1][1] = 42; 

一個更好的替代品,你有什麼將指針返回到新的矩陣替代,並分配給您的變量。

double **assign_matrix_storage(int n) { 
    double **matrix; 
    /* the rest of your implementation */ 
    return matrix; 
} 

double **A; 
A = assign_matrix_storage(2); 
A[1][1] = 42; 
3

發生這種情況是因爲A未被assign_matrix_storage()更改。 C是按值傳遞的,所以你傳入了A的拷貝。所以你在函數中對A做出的改變會丟失。參數需要是double ***pointerToA之類的東西,然後當你調用函數時,你會做assign_matrix_storage(&A, 2);而且顯然在assign_matrix_storage()裏面,你需要正確地遵守pointerToA一個「等級」。

+1

返回一個'double **'而不是接受'double ***'的參數可能會更好。 – 2011-04-25 03:56:58

+0

偉大的一點!有'assign_matrix_storage()'只需要'int n'並讓它做分配並返回'double **'。 – QuantumMechanic 2011-04-25 03:58:04

1

也許這個實現是有用的。

/* Allocate space for a unit-off-set (m times n) matrix b[1..n][1..m] */ 
/* Note that b_{ij}=b[j][i], so the i'th column is b[i] */ 
double **matrix(int m, int n){ 
    int i; 
    double **a = (double **)malloc(n*sizeof(double *)); 
    double **b=a-1; /* make unit off-set */ 
    for (i=1; i<=n; i++) b[i] = (double *)malloc((m+1)*sizeof(double)); // m+1, not m! 
    return(b); 
}