ACM - 第四章 gcc,函數,堆棧,以及C語言

今天看了第四章,按照這個速度真是夠嗆能看完,仍是要提升一下本身的效率啊。。調試

assert.h

利用assert.h調試,經過檢測變量值來肯定程序運行過程當中的問題code

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\n", 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段。it

此外,局部變量也是存放在堆棧段的,因此棧溢出不見得是遞歸調用過多,也多是局部變量太大(Stack Overflow)。io

ulimit 查看棧大小

Linux的棧大小經過ulimit命令修改,不過在比賽中彷佛是不容許的。
使用ulimit -s命令查看棧大小,單位是KB編譯

相關文章
相關標籤/搜索