1

我試圖將我的字符串轉換爲雙精度動態數組。我的字符串的每個空格表示一列,每個「;」代表了一個新的行。當此代碼運行時,它僅適用於* F [0] [col]。當它到達* F [1] [col]時,它給我提示錯誤「CCode.exe中的0x00e4483c未處理異常:0xC0000005:訪問衝突讀取位置0xcccccccc」。有人知道爲什麼通過引用傳遞2D動態分配的雙數組C在C

void main(void) { 
    double **F = NULL; 
    F = malloc(row * sizeof (double *)); 
    for (m=0; m < row;m++) { 
     F[m] = malloc(col * sizeof(double)); 
    } 
    FParser(string, &F); 
for (m=0;m<rowF;m++) 
    free(F[m]); 
free(F); 
} 

void FParser(char string[256], double ***F) { 
    while (dummyChar_ptr != NULL) { 
    dummyChar_ptr = strtok(dummyChar_ptr," "); 
    while ((dummyChar_ptr) != NULL) { 
     *F[row][col] = atof(dummyChar_ptr); 
     dummyChar_ptr = strtok(NULL," "); 
     col++; 
    } 
    col=0; 
    row++; 
    strcpy(dummyChar,string); 
    dummyChar_ptr = strtok(dummyChar,";"); 
    for (x=0;x<row;x++) 
     dummyChar_ptr = strtok(NULL,";"); 

    } 

//example String: 1 0.1 0 0; 0 1 0 0; 0 0 1 0.1; 0 0 0 0.1 
+0

你爲什麼不發佈完整的代碼?我們無法找到您的行和列的定義。他們是全球變數嗎?也許問題是你在main和FParser之間共享行/列。 – Francis 2010-01-24 06:08:23

+0

你可以修復你的代碼清單嗎?我認爲它缺少聲明和右大括號,很難閱讀。 – Anycorn 2010-01-24 06:09:45

回答

8

[]比用C一元*的優先級高,所以*F[row][col]實際上是*(F[row][col]),而你索引到錯誤的存儲位置。

嘗試(*F)[row][col])

順便說一句,FParser無論如何都沒有理由採取double***F已經是一個指針;只是通過了。如果FParser需要修改什麼main()F指向,您需要使用額外級別的間接性的唯一原因。建議

其他雜項位:

  • 檢查malloc是否成功。
  • 避免全局變量。
  • 請勿使用strcpy,除非您已檢查源字符串不會溢出目標緩衝區。
  • 函數參數char string[256]實際上並不能保證輸入參數是一個由256個(或更多)元素組成的數組,因此IMO是毫無意義的,也可能是char* string
+0

它的工作原理!謝謝Jamesdlin,感謝您的迴應和建議。 – anonymous 2010-01-24 15:04:29

+1

@ heckler01:不要忘記接受答案。 ;) – jamesdlin 2010-01-24 20:08:50

+0

事實上,'char string [256]'參數*的類型是char *'(例如,'sizeof string'不會計算爲'256')。 – caf 2010-01-24 23:01:58