2012-05-26 29 views
0

針對argc參數,我得到段錯誤錯誤。我是C語言的新手。請幫我解決這個問題。針對argc參數的段錯誤錯誤

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

int main(int argc, char *argv[]) 
{ 
    int row1, row2, col1, col2, i, j, cnt=0; 
    int mat1[2000][2000], mat2[2000][2000]; 

    printf("argc=%d", argc); 

    if (argc<5) 
    { 
    printf("\nPlease enter correct arguments <row_no_matrix1> <col_no_matrix1> <row_no_matrix2> <col_no_matrix2>\n"); 
    exit(0); 
    } 

    row1 = atoi(argv[1]); 
    col1 = atoi(argv[2]); 
    row2 = atoi(argv[3]); 
    col2 = atoi(argv[4]); 

    printf("%d %d %d %d\n", row1, row2, col1, col2); 
    return 0; 
} 
+0

你是什麼意思的「argc論點分段故障錯誤」。發佈EXACT錯誤。 – abelenky

回答

5

您的矩陣對於機器上的堆棧太大。每個陣列有400萬個整數,或大約16 MiB的存儲空間;這是一個非常大的堆棧要求。

要麼減小它們的大小,要麼動態分配它們。

或(如在評論中所指出),使它們成爲與「靜止持續時間」的變量,無論是內main與關鍵字static在前面:

int main(int argc, char *argv[]) 
{ 
    int row1, row2, col1, col2, i, j, cnt=0; 
    static int mat1[2000][2000], mat2[2000][2000]; 

或作爲文件範圍的變量定義外main(),也在前面的關鍵字static

static int mat1[2000][2000], mat2[2000][2000]; 

int main(int argc, char *argv[]) 
{ 
    int row1, row2, col1, col2, i, j, cnt=0; 

或爲全局變量外main()定義不包含此關鍵字static(但如果你只做到這一點有多個源文件需要按名稱訪問它們):

int mat1[2000][2000], mat2[2000][2000]; 

int main(int argc, char *argv[]) 
{ 
    int row1, row2, col1, col2, i, j, cnt=0; 

您還可以(同樣,如註釋中所述)增加堆棧大小。然而,我恭敬地提出這可能是最不滿意的解決方案。

如何動態分配數組的大小?

公平的問題。與100倍100陣列下的處理頻率相比,您認爲您真的需要一對400萬個陣列陣列的頻率如何?此外,你在Windows(MSVC和C89)還是非Windows(C99或更高版本),還是在Windows上使用GCC?

另外,你有沒有學到關於指針呢?總的來說,我認爲你應該選擇更小的陣列。這是迄今爲止最簡單的解決方案。如果您必須擁有大數組,請使用靜態分配的數組。

如果這不起作用,我們將不得不經過指針,但它不漂亮。

+2

..或讓他們'靜態'。 –

+1

...或增加堆棧大小。 –

+0

如何動態分配數組的大小? – Aps