A. 什麼是編譯開關 pascal
在編譯窗口中連按兩下「ctrl+o」可以在程序頭中出現所有編譯開關情況,也可以自己書寫。
下面是一些常見開關所代表的意思:
1)數據對齊(Align Data)
{$A+}或{$A-}
在{$A+}狀態下,將非字元按偶地址對齊存放,可以提高8086和80286存取數據的速度。不影響位元組變數、記錄域結構和數組元素。在{$A-}狀態下,將使用位元組對齊方式,數據可存放在奇地址或偶地址。
2)布爾運算(Boolean Evaluation)
{$B+}或{$B-}
在{$B+}狀態下,編譯器產生完全布爾表達式運算代碼。布爾表達式中的每個操作都確保被計算。既是整個表達式的結果以確定,還繼續運算其餘的表達式。
在{$B-}狀態下,編譯器產生短路布爾表達式運算代碼。接著從左到右運算,當整個表達式結果確定後,就停止運算。
3)調試信息(Debug Information)
{$D+}或{$D-}
{$D+}產生調試信息,它在編譯程序或單元產生運行錯誤時,能自動定位引起錯誤的語句。
4)浮點模擬(Emulation)
{$E+}或{$E-}
{$E+}只是在8087協處理器不存在時,將連接運行庫以便對協處理器進行模擬。
{$N+,$E+}狀態編譯程序,系統將同8087模擬器連接,得到exe文件,不管有無8087,都可以在機器上進行IEEE標准754的二進制浮點運算。
{$N+,$E-}狀態下,只能在有8087時,才能進行IEEE標准754的二進制浮點運算。
8087模擬開關如果用在一個單元是無效的,它只能用於程序的編譯。
5)輸入輸出檢查(Input/Output Checking)
{$I+}或{$I-}
$I指示控制是否自動產生對調用過程的結果進行檢查。
6)數字處理(Numberic Processing)
{$N+}或{$N-}
{$N-}狀態,在機器上只能進行實數類型運算。在{$N+}狀態,在有8087協處理器或沒有用{$E+}指示對8087進行模擬,都可以對IEEE浮點類型進行運算。
7)范圍檢查(Range Checking)
{$R+}或{$R-}
$R+進行邊界和范圍檢查
8)棧溢出檢查(Stack Overflow Checking)
{$S+}或{$S-}
在{$S+}狀態下編譯,程序在每個過程或函數的開始生成一段代碼,用於檢查是否有足夠的棧空間供局部變數使用。若棧空間不夠,程序停止運行,並顯示運行錯誤。
在{$S+}狀態下這樣調用會導致系統崩潰。
9)變數串檢查(Var String Checking)
{$V+}或{$V-}
在{$V+}狀態下,實行嚴格的類型檢查,要求形參、實參具有同一字元串類型。
在{$V+}狀態下,允許任意類型的字元串變數作為實參,甚至是一實參的最大長度不同於形參長度。
BP7下的最佳參數是:
{$A+,B-,D-,E-,F-,G+,I-,L-,N+,O-,P+,Q-,R-,S-,T-,V-,X+,Y-}
{$M 65520,0,655360}
其中D和L與調試有關,調試時必須打開這兩個參數
N+可以使程序能夠使用擴展實型。一般情況下,Real速度最慢,不應該使用。
在編輯環境下按Ctrl+O+O,可以自動列出默認的編譯指示,然後再自己改,這樣比較快
要想知道各個參數的意義,可以察看BP7的聯機幫助文檔
B. 為什麼在VIJOS上的AC程序在cena上測有兩個點棧溢出
因為測評機不同咯,一個程序在vijos伺服器上運行,一個在cena所在機器上運行。
棧溢出就是堆棧的空間不夠用了,棧空間大小和機器、操作系統、編譯器都可能有關。不過cena上測出棧溢出的話,應該還是程序本身佔用太多棧空間了,只不過可能vijos上的機器比較強大或者限制比較寬讓它過了而已。
C. C語言 linux編程 stack smashing detected問題,幫我看看這段代碼哪棧溢出。。。。
while循環中的else中printf("%s",mail)有問題,recv(sockfd,message,250,0)接收到的字元串中不含有結束符號「\0」所以當你用printf去輸出mail字元串時找不到結束標記,所以會產生越界行為。你應該把if(size<250)中的mail[Size]=0放到Size=recv(sockfd,mail,250,0)的後面;這個問題應該就可以解決了。還有請記住不要用編譯器自帶的默認初始化值,那個不可靠。
D. 編程中棧溢出的問題
這個。。。VC不讓,說明VC有這個保護;C++對這個因該沒有限制的,這個只是VC這個編譯器認為你機器可能沒這么牛B。
gcc就不管的,呵呵,但太大會運行時出錯。
E. 堆溢出是error還是exception
堆內存溢出: OutOfMemoryError,是ERROR。
一、什麼是Error:
Error用於指示應用程序不應該試圖捕獲的嚴重問題。
二、什麼是Exception:
Exception類及其子類用於指示應用程序需要處理的異常。
三、Error與Exception之間的聯系:
1.繼承聯系:
Error與Exception都繼承java.lang.Throwable(所有錯誤或異常的超類)。
2.檢查異常:
未檢查異常: Error與RuntimeException及其子類稱為未檢查異常(未顯示提醒的異常),java編譯器未檢查的代碼塊,當程序運行時可能出現的異常,在沒有try和catch,也沒有throws的情況下,仍然可以編譯通過。
如:OutOfMemoryError(內存溢出異常),StackOverflowError(堆棧溢出時,拋出該錯誤),(數組超出排序索引范圍時拋出)等異常。

檢查異常:
除了Error與RuntimeException及其子類其他都稱為檢查異常(提醒處理的異常),這類異常如果沒有try和catch,也沒有throws的情況下,編譯是不能通過的。
如:TimeoutException(阻塞操作超時時,拋出該異常),IOException(當發生某種 I/O 異常時,拋出此異常)。
F. 堆棧溢出一般是由什麼原因導致的
遞歸過程的局部變數過多、遞歸深度過大,是造成系統棧溢出的原因,特別是遞歸列循環時肯定會發生系統棧溢出。
遞歸堆棧溢出的解決方案是尾部遞歸優化。事實上,尾部遞歸和循環具有相同的效果,所以可以把循環看作是一個特殊的尾部遞歸函數。
尾部遞歸,當函數返回時調用自身,並且返回語句不能包含表達式。通過這種方式,編譯器或解釋器可以優化尾部遞歸,這樣遞歸本身無論被調用多少次,都只佔用一個堆棧幀,而不會出現堆棧溢出。

(6)編譯器檢查棧溢出擴展閱讀:
針對堆棧溢出可能造成的計算機安全問題,通常有以下這些防範措施:
1、強制代碼遵循正確的規則。
2、使操作系統無法執行緩沖區,從而防止攻擊者植入攻擊代碼。但是,由於攻擊者不必求助於嵌入代碼,而且Linux使用可執行的堆棧屬性來發出信號和在線重用GCC,這種方法仍然有一些弱點。
3、利用編譯器的邊界檢查實現緩沖區保護。這種方法使緩沖區溢出不可能發生,完全消除了緩沖區溢出的威脅,但是代價很高,比如性能較低。
4、對程序指針完整性進行檢查,該方法可以防止絕大多數的緩沖區溢出攻擊。這意味著在程序使用指針之前檢查指針的內容是否已更改。
G. 如何解決棧溢出
解決遞歸調用棧溢出的方法是通過尾遞歸優化,事實上尾遞歸和循環的效果是一樣的,所以,把循環看成是一種特殊的尾遞歸函數也是可以的。
尾遞歸,在函數返回的時候,調用自身本身,並且,return語句不能包含表達式。這樣,編譯器或者解釋器就可以把尾遞歸做優化,使遞歸本身無論調用多少次,都只佔用一個棧幀,不會出現棧溢出的情況。

(7)編譯器檢查棧溢出擴展閱讀
針對堆棧溢出可能造成的計算機安全問題,通常有以下這些防範措施:
1、強制按照正確的規則寫代碼。
2、通過操作系統使得緩沖區不可執行,從而阻止攻擊者植入攻擊代碼。但由於攻擊者並不一定要通過植入代碼來實現攻擊,同時linux在信號傳遞和GCC的在線重用都使用了可執行堆棧的屬性,因此該方法依然有一定弱點。
3、利用編譯器的邊界檢查來實現緩沖區的保護。該方法使得緩沖區溢出不可能出現,完全消除了緩沖區溢出的威脅,但代價較大,如性能速度變慢。
4、程序指針完整性檢查,該方法能阻止絕大多數緩沖區溢出攻擊。該方法就是說在程序使用指針之前,檢查指針的內容是否發生了變化。
H. Pascal 棧溢出
一般不會,只要你的遞歸有結束。要是數組什麼的開的不夠,也可能會溢出。
I. 用microsoft visual studio 2008執行C語言出現棧溢出怎麼解決
if(n==1)
move(one,three);
else
{
hanoi(n-1,one,three,two);
move(one,three);
} hanoi(n-1,two,one,three);
應該是這樣的
if(n==1)
move(one,three);
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
大括弧位置打錯了,呵呵,要用心檢查哦!