1

可能重复:
C 中的最大数组大小

这是我的代码。我从两个文本文件中读取两个字符串并存储它们。然后我定义了两个二维数组,但问题是,大小非常有限。例如,如果我将 size 定义为 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 Visual C++ 2010 Express。先感谢您。

4

1 回答 1

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

这是占主导地位的两大巨头。2 x 4 x 400 x 400 = 1,280,000 字节。进程主线程的默认堆栈大小是 1 兆字节,它们不适合。在 main() 入口点探测堆栈的 __alloca_probe() 调试函数会生成此站点命名的异常。

线程的堆栈大小在 CreateThread() 中指定,但进程的主线程由 Windows 启动。它从 EXE 标头 IMAGE_OPTIONAL_HEADER.SizeOfStackReserve 字段中检索请求的大小。它是在您构建程序时由链接器编写的。您使用 /STACK 链接器选项覆盖默认值,在 IDE 中,它由 Project + Properties、Linker、System、Stack Reserve Size 选项设置。

于 2012-11-22T20:10:48.970 回答