2011-04-29 76 views
0

因此,這裏是我的代碼:問題與陣列輸入

#include <stdio.h> 
#include <ctype.h> 
#include <stdlib.h> 
#define MAX n 
int t,n; 
int readtime(); 
int readboardsize(); 
void readboard(int board[MAX][MAX], int n); 
void printboard(int board[MAX][MAX]); 

int main(int argc, char * argv[]){ 
    int board[MAX][MAX]; 
    t = readtime(); 
    n = readboardsize(); 
    printf("%d\n",n); 
    readboard(board,n); 
    printboard(board); 
return 0; 

} 

int readtime() { 
    int nvr, scannedt; 

    printf("Enter t :"); 
    nvr = scanf("%d",&scannedt); 
    if (scannedt>1000 || scannedt<0 || nvr==0) { 
     printf("Incorrect input: t must be 0..1000\n"); 
     exit(EXIT_FAILURE); 
    }  
return scannedt; 
} 

int readboardsize() { 
    int nvr,scannedn; 
    printf("Enter n :"); 
    nvr = scanf("%d",&scannedn); 
    if (scannedn>25 || scannedn<3) { 
     printf("Incorrect input: n must be 3..25\n"); 
     exit(EXIT_FAILURE); 
    } 
return scannedn; 
} 
void readboard(int board[MAX][MAX], int n) { 
    int i,j,nvr; 

    printf("Enter %d by %d forrest:\n",n,n); 
     for(i = 0; i < MAX; i++){ 
      for(j=0; j < MAX; j++){ 
       nvr = scanf("%d",&board[i][j]);  
      } 
     } 
}    
void printboard(int board[MAX][MAX]) { 
    int i,j; 
    printf("Here is the board:\n\n"); 
     for(i = 0; i < MAX; i++){ 
      for(j=0; j < MAX; j++){ 
       if (board[i][j]==0) { 
        printf(". "); 
       }else if (board[i][j]==1){ 
        printf("^ "); 
       }else if (board[i][j]==2){ 
        printf("* "); 
       } 
      }  
     printf("\n"); 
     } 
} 

當我編譯它,它成功完成,但之後我輸入數組我得到這個錯誤:

*** stack smashing detected ***: ./ass2 terminated 
======= Backtrace: ========= 
/lib/libc.so.6(__fortify_fail+0x50)[0x3e3990] 
/lib/libc.so.6(+0xe593a)[0x3e393a] 
./ass2[0x8048768] 
/lib/libc.so.6(__libc_start_main+0xe7)[0x314ce7] 
./ass2[0x8048421] 
======= Memory map: ======== 
00110000-0012a000 r-xp 00000000 08:01 129968  /lib/libgcc_s.so.1 
0012a000-0012b000 r--p 00019000 08:01 129968  /lib/libgcc_s.so.1 
0012b000-0012c000 rw-p 0001a000 08:01 129968  /lib/libgcc_s.so.1 
0025e000-0025f000 r-xp 00000000 00:00 0   [vdso] 
002fe000-00455000 r-xp 00000000 08:01 134635  /lib/libc-2.12.1.so 
00455000-00456000 ---p 00157000 08:01 134635  /lib/libc-2.12.1.so 
00456000-00458000 r--p 00157000 08:01 134635  /lib/libc-2.12.1.so 
00458000-00459000 rw-p 00159000 08:01 134635  /lib/libc-2.12.1.so 
00459000-0045c000 rw-p 00000000 00:00 0 
00c1f000-00c3b000 r-xp 00000000 08:01 130134  /lib/ld-2.12.1.so 
00c3b000-00c3c000 r--p 0001b000 08:01 130134  /lib/ld-2.12.1.so 
00c3c000-00c3d000 rw-p 0001c000 08:01 130134  /lib/ld-2.12.1.so 
08048000-08049000 r-xp 00000000 08:01 427835  /home/stu/Work/comp1911/ass2/ass2 
08049000-0804a000 r--p 00000000 08:01 427835  /home/stu/Work/comp1911/ass2/ass2 
0804a000-0804b000 rw-p 00001000 08:01 427835  /home/stu/Work/comp1911/ass2/ass2 
09c12000-09c33000 rw-p 00000000 00:00 0   [heap] 
b7830000-b7831000 rw-p 00000000 00:00 0 
b783e000-b7842000 rw-p 00000000 00:00 0 
bfe46000-bfe67000 rw-p 00000000 00:00 0   [stack] 
Aborted 

誰能給我與最新進展?

親切的問候

丹尼斯

+2

不知道發生了什麼,但是這條線似乎有點奇怪:'#define MAX n' – 2011-04-29 04:36:55

+0

如果將該行更改爲'#define MAX 10'之類的東西,會發生什麼? 另外,就風格而言,由於't'和'n'只用於'main()',所以考慮在main()中聲明它們爲局部變量。 – QuantumMechanic 2011-04-29 04:45:30

+0

是的,解決它了,非常感謝。現在我必須找到另一種方法來允許用戶定義數組大小。 – 2011-04-29 04:56:44

回答

1

#define MAX n然後int n;略低於。因此,n將被初始化爲零,因爲它具有文件範圍(如果我錯了,有人糾正我,請檢查一些例子,但這不能保證,我沒有標準的方便副本)。然後,你有這樣的主:

int board[MAX][MAX]; 

然後一點點後,你終於值賦給n,然後進行使用。但是,您的board是使用初始值n創建的。其結果是,一切都假設board比它真的大,這就是你如何粉碎你的堆棧。