#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;
}
你的程序表明你開的是局部變量而不是全局變量(關(guān)于全局和局部變量你可以參考C++ 全局變量、局部變量、靜態(tài)全局變量、靜態(tài)局部變量的區(qū)別)。
所以你的數(shù)組是開在棧上的,這就涉及到編譯期限制棧大小的問題。如果你申請這么大的數(shù)組是會stackoverflow的,我記得我原來用devc++寫oj的時(shí)候開了一個(gè)100000的數(shù)組好像就爆棧了,但是現(xiàn)在換到osx的clion下面好像沒事了...
在一般情況下, 不同平臺默認(rèn)棧大小如下(僅供參考)
SunOS/Solaris 8172K bytes (Shared Version)
Linux 10240K bytes
Windows 1024K bytes (Release Version)
AIX 65536K bytes
當(dāng)然你可以修改你的默認(rèn)棧大小:
1.SunOS/Solaris系統(tǒng):
limit # 顯示當(dāng)前用戶的棧大小
unlimit # 將當(dāng)前用戶的棧大小改為不限制大小
setenv STACKSIZE 32768 #設(shè)置當(dāng)前用戶的棧大小為 32M bytes
2.Linux系統(tǒng):
ulimit -a #顯示當(dāng)前用戶的棧大小
ulimit -s 32768 #將當(dāng)前用戶的棧大小設(shè)置為32M bytes
3.Windows (在編譯過程中的設(shè)置)
在 Visual Studio 開發(fā)環(huán)境中設(shè)置此鏈接器選項(xiàng)
如果有很大的結(jié)構(gòu)或者數(shù)據(jù),不要把它定義為局部變量,因?yàn)橐话憔幾g器在生成程序的時(shí)候,會設(shè)置一個(gè)有限的棧大小,當(dāng)然這個(gè)值可以通過設(shè)置編譯參數(shù)來修改。在程序啟動的時(shí)候,就會給它生成一個(gè)給定大小的棧,局部變量、函數(shù)參數(shù)都會存放在棧中,一旦空間用盡,就會棧溢出,程序就崩潰了。
有幾種辦法避免這種情況:
使用動態(tài)分配,如果真的只在函數(shù)中使用這個(gè)數(shù)據(jù),可以這樣處理:
void foo()
{
int *p;
p = new int[1000000];
... // Do something
delete[] p;
}
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。