ACM – 第四章 gcc,函式,堆疊,以及C語言

svtter發表於2019-05-11

今天看了第四章,按照這個速度真是夠嗆能看完,還是要提高一下自己的效率啊。。

assert.h

利用assert.h除錯,通過檢測變數值來確定程式執行過程中的問題

c#include <stdio.h>
#include <assert.h>

int main()
{
    int x = -1;
    assert(x > 0);
    return 0;
}

變數交換

c#include <stdio.h>

void swap(int *a, int *b)
{
    int t = *a;
    *a = *b;
    *b = t;
}

void output(int a, int b)
{
    printf("a: %d, b: %d
", a, b);
}

int main()
{
    int a = 1, b = 2;
    output(a, b);
    swap(&a,&b);
    output(a, b);
    return 0;
}

使用gdb除錯程式

  • 編譯選項
    gcc temp.c -g
  • 執行
    gdb a.out
  • 顯示變數
    p $
  • 檢視呼叫棧
    bt

段錯誤和棧溢位

使用size命令來檢視執行檔案中段大小

   text    data     bss     dec     hex filename
   1320     280       4    1604     644 3-8

分別是正文段,資料段和bss段。

此外,區域性變數也是存放在堆疊段的,所以棧溢位不見得是遞迴呼叫過多,也可能是區域性變數太大(Stack Overflow)。

ulimit 檢視棧大小

Linux的棧大小通過ulimit命令修改,不過在比賽中似乎是不允許的。
使用ulimit -s命令檢視棧大小,單位是KB

相關文章