0

argc引数のセグメンテーション違反エラーが発生します。私はC言語に不慣れです。これを解決するのを手伝ってください。

#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;
}
4

1 に答える 1

5

マトリックスが大きすぎて、マシンのスタックには対応できません。各アレイには400万の整数、つまり約16MiBのストレージがあります。これは非常に大きなスタック要件です。

サイズを小さくするか、動的に割り当てます。

または(コメントに記載されているように)、前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;

また、(コメントに記載されているように)スタックサイズを増やすこともできます。しかし、私はそれがおそらく最も満足のいく解決策ではないことを敬意を表して提案します。

配列のサイズを動的に割り当てる方法は?

公正な質問。たとえば、100x100未満のアレイを処理する頻度と比較して、実際に400万個のセルアレイが必要になる頻度はどれくらいだと思いますか。また、Windows(MSVCおよびC89を使用)または非Windows(C99以降を使用)、またはGCCを使用するWindowsを使用していますか?

また、ポインタについてはもう学びましたか?

全体として、より小さなサイズのアレイを選択する必要があると思います。これが最も簡単な解決策です。大きな配列が必要な場合は、静的に割り当てられた配列を使用してください。

それがうまくいかない場合は、ポインタを調べる必要がありますが、それはきれいではありません。

于 2012-05-26T22:09:37.493 に答える