2012-08-14 56 views
1

我不知道錯誤是什麼,因爲這是在Windows上,我不知道如何逐步通過Windows上的程序執行。關於爲什麼程序在這裏崩潰的任何想法(請參閱註釋行)?我認爲這可能與內存濫用有關。傳遞C字符數組並分配導致程序崩潰

#define TABLE_MAX_ROW  500 
#define TABLE_MAX_COL  20 
#define TABLE_MAX_ELT_LEN 60 

從這裏開始:

foo() 
{ 
    char table[TABLE_MAX_ROW][TABLE_MAX_COL][TABLE_MAX_ELT_LEN]; 

    bar(table); 
} 

傳遞給該函數:

bar(char table[TABLE_MAX_ROW][TABLE_MAX_COL][TABLE_MAX_ELT_LEN]) 
{ 
    unsigned int col, row; 

    if (table == NULL) { // crashes here 
     printf("error: table == NULL!\n"); 
     return -1; 
    } 

    for (row = 0; row < TABLE_MAX_ROW; row++) 
    for (col = 0; col < TABLE_MAX_COL; col++) 
     table[row][col][0] = '\0'; // if above if block commented out, crashes here 

    return 0; 
} 
+2

這是一個非常大的數組分配在堆棧中。如果將「最大」值更改爲1 1和1,會發生什麼情況? – ddyer 2012-08-14 19:13:45

+0

我無法重現Windows Visual C++ Express中的任何崩潰。 – MRAB 2012-08-14 19:19:43

+0

在我的機器上運行良好,使用MinGW編譯,包含windows.h和iostream。 – Dmitriy 2012-08-14 19:19:55

回答

2

正如所寫,bar中的NULL檢查是不必要的,因爲tablefoo中沒有被動態分配。

話雖如此,你可能超過您的堆棧幀大小與該陣列定義(60 Kb),導致bar運行時問題,導致崩潰。

嘗試動態分配數組如下:

void foo (void) // explicitly type all functions 
{ 
    /** 
    * Declare a *pointer* to a 2D array of col x len and 
    * allocate rows elements of it: 
    */ 
    char (*table)[TABLE_MAX_COL][TABLE_ELT_LEN] = 
    malloc(sizeof *table * TABLE_MAX_ROW); 

    if (table) 
    { 
    bar(table); 
    } 

    free(table); 
} 

int bar(char (*table)[TABLE_MAX_COL][TABLE_ELT_LEN]) 
{ 
    unsigned int row, col; 

    /** 
    * Some duplication of effort here, since we made the null check 
    * in foo, but what the heck. 
    */ 
    if (!table) 
    { 
    // handle error as above 
    return -1; 
    } 

    // process table as above 
    return 0; 
} 
+0

@ ryucl0ud它的工作。謝謝約翰 – wanovak 2012-08-14 19:38:27

1

嘗試分配的空間正在創建

焦炭***表中的三維陣列= sizeof(sizeof(sizeof(char)* TABLE_MAX_ELT_LEN)* TABLE_MAX_COL)* TABLE_MAX_ROW)

這至少會爲您提供足夠的空間來存放所有元素。

+0

謝謝,邁克。我不是那種你能稱之爲流利的C.你能否告訴我如何將它融合到現有的工作流程中?我不想改變'bar'參數。 – wanovak 2012-08-14 19:26:53

+0

那麼現在你的Bar參數是一個字符指針(一個字符數組[[String])。據我所知,你必須改變條形函數的參數。您需要將其設置爲一個由數組組成的數組(數組的字符串數組)或字符串矩陣。 – Mike 2012-08-14 19:52:41

1

程序存儲器依賴於操作系統。我強烈懷疑崩潰的原因是你的系統無法滿足堆棧上這麼大的數組分配(差不多0.6MB!)。最好去malloc

1

問題可能是您的堆棧沒有足夠的空間來分配大量的緩衝區。我會建議你dynamically allocate陣列。

您也可以使用便利宏指定一個平緩衝區,如this後所述。唯一的區別是你的數組是「3d」而不是「2d」。

0

您正在堆棧中爲您的「表」變量使用500x20x60 = 600000字節進行分配。

如果你的shell是bash

ulimit -slimit stacksize爲[T] CSH)

將顯示您可以在程序堆棧上使用的最大內存量。 如果使用超過此限制,這是程序段錯誤的原因。