#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 (在編譯過程中的設置)
在 Visual Studio 開發(fā)環(huán)境中設置此鏈接器選項
如果有很大的結(jié)構(gòu)或者數(shù)據(jù),不要把它定義為局部變量,因為一般編譯器在生成程序的時候,會設置一個有限的棧大小,當然這個值可以通過設置編譯參數(shù)來修改。在程序啟動的時候,就會給它生成一個給定大小的棧,局部變量、函數(shù)參數(shù)都會存放在棧中,一旦空間用盡,就會棧溢出,程序就崩潰了。
有幾種辦法避免這種情況:
使用動態(tài)分配,如果真的只在函數(shù)中使用這個數(shù)據(jù),可以這樣處理:
void foo()
{
int *p;
p = new int[1000000];
... // Do something
delete[] p;
}
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學院和江蘇省首批服務外包人才培訓基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務機構(gòu),發(fā)展為教育服務業(yè)的綜合性企業(yè)集團,成為集合面授教學培訓、網(wǎng)
達內(nèi)教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務負責iOS教學及管理工作。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。