2014-02-10 18 views
0
#include <stdio.h> 
#define N 100 

int main() 
{ 
int n,c,d,a[N],b[N]; 

printf("Insert elements numbers in the array\n"); 
scanf("%d ", n); 

printf("Insert the elements in the array\n"); 

for (c = 0; c < n ; c++) 
scanf("%d", a[c]); 

for (c=n-1,d = 0;d < n; c--,d++) 
b[d]= a[c]; 

for(c = 0; c <n; c++) 
a[c] = b[n]; 

printf("The array inverted is\n"); 

for(c=0; c<n;c++) 
printf("%d\n",a[c]); 

return 0; 
} 

爲什麼會崩潰?我試過,即使有值(N < 100),但仍然崩潰,我不知道如何解決它?有人能幫助我嗎 ?謝謝 !爲什麼會崩潰? (緩衝區溢出)

+5

'的scanf( 「%d」,N);'必須是'的scanf( 「%d」,&n);' –

+1

'一個並[c] = b [n];'? – BLUEPIXY

回答

6

此:

scanf("%d ", n); 

調用未定義的行爲。 scanf()需要一個指向該號碼應存儲,它應該是:

scanf("%d ", &n); 

同樣爲您的通話scanf()的其餘部分。另外,在依賴包含有效值的變量之前,您應該檢查返回值以知道它成功讀取了數據。

+1

+1建議檢查成功返回值。 – kbshimmyo

3

scanf需要寫入的地址,而不是實際的值。

而是執行此操作:

scanf("%d", &a[c]); 
0

他們說,大約需要scanf的地址是什麼。但是,這是幹什麼的?

for(c = 0; c <n; c++) 
    a[c] = b[n]; 

n是每個陣列中元件的數量,因此調用b[n]會給你一個(可能不通知)的問題。編譯器往往不會警告那種越界訪問(參見this post)。

我懷疑你打算複製到b反正a,而不是一個值複製到的a每一個元素,但是這純粹是猜測,因爲你還沒有宣佈預期的輸入或輸出是什麼。

0

爲什麼會崩潰?

Wiki表示:當在計算機或程序(例如,軟件應用程序或操作系統)而不能正常工作

在計算崩潰(或系統崩潰)是。通常情況下,它會在遇到這些錯誤後退出。負責的程序可能會凍結,直到崩潰報告服務記錄崩潰的詳細信息。如果程序是操作系統內核的關鍵部分,整個計算機可能會崩潰,通常會導致致命的系統錯誤。這種行爲被稱爲「崩潰」。

導致應用程序崩潰

典型錯誤包括:

  • 試圖讀取或寫入不是由應用程序(分段錯誤)分配用於讀取或寫入內存或x86具體的(一般保護錯誤)
  • 試圖執行特權或無效指令
  • 試圖對其無權訪問的硬件設備執行I/O操作
  • 將無效參數傳遞給系統調用
  • 嘗試訪問應用程序無權訪問的其他系統資源(總線錯誤)
  • 嘗試執行具有錯誤參數(取決於CPU體系結構)的機器指令:除以零,對denorms或NaN執行的操作值,存儲器訪問未對齊地址等

在你的程序中,陳述

scanf("%d ", n); 

scanf("%d", a[c]); 

導致您的程序崩潰。

正如其他建議代替scanf參數之前&操作者

scanf("%d ", &n); 
scanf("%d", &a[c]);