2015-12-19 48 views
-2

我在執行動態矩陣時遇到了一些麻煩。 從理論上講,我似乎很清楚自己必須做什麼,並且我已經閱讀了本網站上的一些類似問題(以及其他資源)。雖然,下面非常簡單的代碼不起作用。 你介意如何找出錯誤嗎?嘗試在C中實現動態大小矩陣。錯誤在哪裏?

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

int main() { 
    int dim1 = 10; // #Rows 
    int dim2 = 4; // #Columns 
    int i; 
    int j; 

    double **mtrx = (double **)malloc(sizeof(double **) * dim1); 
    // mtrx is my dynamic matrix, of size dim1*dim2 // 

    for (i = 0; i < dim1; ++i) 
     mtrx[i]= (double *)malloc(sizeof(double *) * dim2); 

    // (1) Inizialize// 
    for (i = 0; i < dim1; ++i) { 
     printf("(%d):\t", i); 
     for (j = 0; j < dim2; ++j) { 
      mtrx[i][j] = i; 
      printf("mtrx[%d][%d] = %.f ", i, j, mtrx[i][j]); 
     } 
     printf("\n"); 
    } 

    // (2) Show the results// 
    printf("\nShow the results:\n"); 

    for (i = 0; i < dim1; ++i) { 
     printf("(%d):\t", i); 
     for (j = 0; j < dim2; ++j) 
      printf("mtrx[%d][%d] = %.f ", i, j, mtrx[i][j]); 
     printf("\n"); 
    } 

    // (3) Free the memory 
    printf("\n***free the memory***\n"); 

    for (i = 0; i < dim1; ++i) 
     free(mtrx[i]); 

    free(mtrx); 

    return 0; 
} 

我的代碼的目的如下。 首先,聲明尺寸爲dim1 * dim2(即「dim1」行和「dim2」列)的動態矩陣。 比階段(1),初始化每個元素遵循一個簡單模式(mtrx [i] [j] = i)。 請注意,這裏有一個「超出」的printf指令:爲了「調試」目的,我添加了它以確保初始化過程的正確性(看起來工作正常)。 然後,階段2,我展示了結果,最後我釋放了使用的內存。

的問題是:

  • 相2未示出的結果 「正確」;
  • 在免費階段,我得到像

*** free()的一個錯誤:無效的下一個尺寸(快)...

我的犯罪嫌疑人:我可能有錯誤爲我的矩陣聲明內存,導致數據溢出並與「free」指令不兼容,但不幸的是我無法找到該錯誤。

我提前感謝您的任何幫助!

+4

在第一個'malloc'中,您需要使用'sizeof(double *)'和第二個'sizeof(double)'。祝你好運。 –

+0

天哪,你是對的!非常非常感謝你! ;) – user233650

+0

不客氣。 –

回答

2

當你有一個malloc時,參數就是你想要分配的大小(字節)。所以,如果你想只有一張桌子,你必須寫

(sizeof(type of the table) * the_number_of_cells_you_want); 

你應該首先分配sizeof(double*) * dim1。然後在循環中:

for (i = 0; i < dim1; ++i) 
    mtrx[i]= malloc (sizeof (double) * dim2); 
1

需要改變這兩個地方的內存分配其他代碼似乎是罰款和don't cast the result of malloc

double ** mtrx = malloc (sizeof (double *) * dim1); 

     mtrx[i]= malloc (sizeof (double) * dim2); 
3

您正在爲數組分配指針數組。 C99允許你這樣分配與運行時的大小二維數組中的一個步驟:

double (*mtrx)[dim2] = malloc(sizeof(double) * dim1 * dim2); 

如果dim1dim2不太大,你甚至可以定義mtrx作爲本地二維陣列自動存儲:

double mtrx[dim1][dim2]; 

您需要一個現代化的C編譯器,gccclang,微軟自己的C編譯器已經過時了,並且不支持C99特性,15年前就已經標準化了。幸運的是,gccclang可用於Windows操作系統的不同端口。

+0

感謝您的進一步信息! – user233650