1

重複の可能性:
C の最大配列サイズ

これが私のコードです。2 つのテキスト ファイルから 2 つの文字列を読み取り、保存します。次に、2 つの 2 次元配列を定義しますが、問題はサイズが非常に限られていることです。たとえば、サイズを 400 と定義すると、コンパイル時にスタック オーバーフローが発生します。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <windows.h>
#include <time.h>

#define BUFSIZE 2000
#define size 400

int main()
{
    int a = 0, len1 = 0, len2 = 0;
    char string1[BUFSIZE];
    char string2[BUFSIZE];
    char *suc;

    FILE *fp1 = fopen("input1.txt", "r");
    FILE *fp2 = fopen("input2.txt", "r");
    if ((fp1 == 0)||(fp2 == 0))
    {
        fprintf(stderr, "Error while opening");
        return 0;
    }

    suc = fgets(string1, BUFSIZE, fp1);
    if (!suc) {
        // fgets failed, what now? exit?
        return EXIT_FAILURE;
    }

    suc = fgets(string2, BUFSIZE, fp2);
    if (!suc) {
        // see above
        return EXIT_FAILURE;
    }

    len1=strlen(string1);
    len2=strlen(string2);

    int LCSLength[size][size];
    for(int i=0;i<size;i++)
    {
        for(int j=0;j<size;j++)
        {
            LCSLength[i][j]=0;
        }
    }

    int index[size][size];
    for(int i=0;i<size;i++)
    {
        for(int j=0;j<size;j++)
        {
            index[i][j]=0;
        }

    }

    printf("The two strings are: \n\n");
    printf("%s\n", string1);
    printf("The length is %d\n\n", len1);
    printf("%s\n", string2);
    printf("The length is %d\n\n", len2);

    int x=0;
    scanf("%d", &x);
    fclose(fp1);
    fclose(fp2);
    return 0;

}

それは私のコンパイラと関係がありますか? MSビジュアルC++ 2010 Expressです。前もって感謝します。

4

1 に答える 1

2
int LCSLength[size][size];
int index[size][size];

それらは支配的な2つの大きなものです。2 x 4 x 400 x 400=1,280,000バイト。プロセスのメインスレッドのデフォルトのスタックサイズは1メガバイトであり、適合しません。main()エントリポイントでスタックをプローブする__alloca_probe()デバッグ関数は、このサイトの名前が付けられた例外を生成します。

スレッドのスタックサイズはCreateThread()で指定されますが、プロセスのメインスレッドはWindowsによって開始されます。要求されたサイズをEXEヘッダーのIMAGE_OPTIONAL_HEADER.SizeOfStackReserveフィールドから取得します。これは、プログラムをビルドするときにリンカーによって書き込まれます。デフォルトは/STACKリンカーオプションでオーバーライドします。IDEでは、プロジェクト+プロパティ、リンカー、システム、スタック予約サイズオプションで設定されます。

于 2012-11-22T20:10:48.970 に答える