段錯誤
- 遞歸里面算階乘 f(10000000)沒有輸出,使用gdb 顯示 SIGSEGV--段錯誤
- 編譯后產生的可執行文件里面保存著什么?
- UNIX/Linux 用 ELF
- DOS下用COFF
- Windows用PE(COFF擴充而得)
- 段(segmentation)
- 二進制文件內的區域。
- 可用size程序得到可執行文件中的各個段的大小
- Text Segment--正文段--儲存指令
- Data Segment--數據段--儲存已初始化的變量
- BSS Segment--BSS段--未賦值的全局變量
- 棧
- 棧不儲存在可執行文件內,而是在運行時創建
- 調用棧所在的段成為Stack Segment
- 和其他段一樣,不能越界訪問,否則會stack overflow
- 調用棧保存函數的調用關系和局部變量
- 棧空間的大小
- linux 通過ulimit修改 ulimit -a顯示當前棧的大小, ulimit -s 32768 把棧大小指定為32MB
- windows 用gcc指定執行文件的棧大小,-Wl,--stack=<byte count>
- 局部變量也是放在堆棧段中,棧溢出不一定是因為遞歸調用太多次,可能是局部變量太大。因此建議“把較大的數組放在main函數外。
競賽題目
- 劊子手游戲
- 看輸入字符和給定字符關系
- 使用全局變量可便于維護內容,可以免去過多的參數傳遞。
- 猜過的字母再猜一次算錯:將猜過的字母從答案內“刪去”(改成不可能滿足為答案的條件的數據)
- 救濟金發放
- 一圈官員,兩個官員逆時,順時針數k, m個數,停下,被選中的離開隊伍(可能是同一個人)
-
#include<stdio.h> #define maxn 25 int n,k,m,a[maxn]; //逆時針走t步,步長為d 返回新位置 int go(int p,int d,int t) {while(t--){do{ //前面減去1??? p=(p+d+n-1)%n+1; //注意這里經過的數字是步數加一! 因此會有最后的+1; }while(a[p]==0);}return p;} int main(){while(scanf("%d%d%d",&n,&k,&m)){for(int i=1;i<=n;i++) a[i]=i;int left=n;int p1=n,p2=1;while(left){p1=go(p1,1,k);p2=go(p2,-1,m);printf("%3d",p1);left--;if(p2!=p1){printf("%3d",p2);left--;}a[p1]=a[p2]=0;if(left)printf(",");}printf("\n");}return 0;}
- 信息解碼
- 01字符串,長度會逐漸增加,且不存在全1的串。 編寫一個解碼程序,輸入一個編碼頭,則序列的每個串對應一個字符。再編碼文本。每個小結前三個數字表示編碼長度,每小節以全1結束,編碼以000結束。