鍍金池/ 問答/C  C++/ 為什么我的代碼10000*10000的二維數(shù)組可以運行,別人的500*500的就

為什么我的代碼10000*10000的二維數(shù)組可以運行,別人的500*500的就不行了?

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAX 0x3f3f3f3f
#define vexnum 10000
typedef struct n{
    int Adjmatrix[11111][11111];
}MG;
int flag[11111] = {0},n,m;
MG x;
int random_num()
{
    int ran;
    
    ran = rand() % 10000 + 1;
    
    return ran; 
}
void Dij(int t[],int lw[])
{
    int i,j,k,min;

    for(i = 1; i <= vexnum; i++){
        lw[i] = x.Adjmatrix[1][i];
        t[i] = 1;
    }

    t[0] = -1;
    flag[1]=1;

    for( i=2 ; i <= vexnum ; i++){
        min = MAX;

        for( j=1 ; j<=vexnum ; j++ ){
            
            if( !flag[j] && lw[j]<min ){
                min = lw[j];
                k = j;
            }
        }

        flag[k] = 1;

        for( j=2; j<=vexnum ; j++){

            if( !flag[j] && min+x.Adjmatrix[k][j] < lw[j] ){

                lw[j] = min + x.Adjmatrix[k][j];
                t[j] = k;
            }
        }
    }
}
int main()
{
    int i,j,sum=0;
    int path[11111],lowcost[11111];
    int u,v,w,pre;

    srand( (unsigned)time( NULL ) );
    //建立矩陣
    for(i=1;i<=vexnum;i++)
        for(j=1;j<=vexnum;j++){

            x.Adjmatrix[i][j] = MAX;
        }

    for(i = 1; i <= vexnum; i++){
        m = random_num();
        for(j = 1;j <= m; j++){
            v = random_num();
            w = random_num();
                    
            if(x.Adjmatrix[i][v] > w && i != v){
               x.Adjmatrix[i][v] = w;
           }
    }
    }

    Dij(path,lowcost);
    for(i = 2; i <= vexnum; i++){
        sum = sum + lowcost[i];
    }
    
    printf("%d\n",sum);

    freopen( "lowcost.txt", "w", stdout );
    for(i = 1; i <= vexnum; i++){
        printf("lowcost[%d] : %d\n",i,lowcost[i]);
    }
    freopen( "path.txt", "w", stdout );    
    for(i = 1; i <= vexnum; i++){
        pre = i;
        printf("v1--v%d : %d\n",pre,lowcost[i]);
        if(lowcost[i] == MAX){
            printf("v1 to v%d has no shortest path\n",i);
        }
        else{
             do{
                printf("v%d<--",pre);
                 pre = path[pre];
                }while(pre != 1);
        
                printf("v1\n");
            }
        }
    return 0;
}
回答
編輯回答
慢半拍

你的程序表明你開的是局部變量而不是全局變量(關于全局和局部變量你可以參考C++ 全局變量、局部變量、靜態(tài)全局變量、靜態(tài)局部變量的區(qū)別)。
所以你的數(shù)組是開在棧上的,這就涉及到編譯期限制棧大小的問題。如果你申請這么大的數(shù)組是會stackoverflow的,我記得我原來用devc++寫oj的時候開了一個100000的數(shù)組好像就爆棧了,但是現(xiàn)在換到osx的clion下面好像沒事了...
在一般情況下, 不同平臺默認棧大小如下(僅供參考)

SunOS/Solaris 8172K bytes (Shared Version)

Linux 10240K bytes

Windows 1024K bytes (Release Version)

AIX 65536K bytes

當然你可以修改你的默認棧大?。?

1.SunOS/Solaris系統(tǒng):
limit # 顯示當前用戶的棧大小
unlimit # 將當前用戶的棧大小改為不限制大小
setenv STACKSIZE 32768 #設置當前用戶的棧大小為 32M bytes

2.Linux系統(tǒng):
ulimit -a #顯示當前用戶的棧大小
ulimit -s 32768 #將當前用戶的棧大小設置為32M bytes

3.Windows (在編譯過程中的設置)

  • 選擇 "Project->Setting".
  • 選擇 "Link".
  • 選擇 "Category"中的 "Output".
  • 在 "Stack allocations"中的"Reserve:"中輸棧的大小,例如: 32768

在 Visual Studio 開發(fā)環(huán)境中設置此鏈接器選項

  • 打開此項目的“屬性頁”對話框。有關詳細信息,請參見設置 Visual C++ 項目屬性。
  • 單擊“鏈接器”文件夾。
  • 單擊“系統(tǒng)”屬性頁。
  • 修改下列任一屬性:
  • 堆棧提交大小
  • 堆棧保留大小

Reference

2017年12月26日 05:24
編輯回答
怣人

因為你的內(nèi)存大

2017年10月8日 04:04
編輯回答
澐染

如果有很大的結(jié)構(gòu)或者數(shù)據(jù),不要把它定義為局部變量,因為一般編譯器在生成程序的時候,會設置一個有限的棧大小,當然這個值可以通過設置編譯參數(shù)來修改。在程序啟動的時候,就會給它生成一個給定大小的棧,局部變量、函數(shù)參數(shù)都會存放在棧中,一旦空間用盡,就會棧溢出,程序就崩潰了。
有幾種辦法避免這種情況:

  1. 使用全局變量
  2. 使用靜態(tài)變量
  3. 使用動態(tài)分配,如果真的只在函數(shù)中使用這個數(shù)據(jù),可以這樣處理:

    void foo()
    {

    int *p;
    
    p = new int[1000000];
    
    ... // Do something
    
    delete[] p;

    }

2018年8月5日 21:47