2007年3月13日星期二

阅读《C陷阱与缺陷》:导读、词法“陷阱”

  • 边界溢出一例
  • #define N 10

    int main()
    {
    int i;
    int a[N];

    printf("Begin...\n");

    for(i=0;i<=N;i++)
    a[i] = 0; //有可能会陷入死循环!

    printf("End...\n");

    return 0;
    }
    因为每次循环结束时a溢出,使得i复为0。

  • 词法分析中的贪心法

  • 1、a---b等价于a-- - b而不是a - --b;
    2、“y = x/*p /* p指向余数 */;”,其中“/*”为注释起始而不是除以*p。

  • 以0开头的数字为八进制表示

  • 如041=33。

  • 单引号引起的问题

  • 1、printf('\n'); //危险!打印地址为'\n'处的字符串。
    2、如下程序:
    int main()
    {
    int i = '1234'; //MSVC与gcc均编译通过,
    但若单引号内的字符大于4则会报错

    printf("%x\n", i); // 0x31323334

    return 0;
    }

    编译器将会把单引号内的字符所对应的ASCII码依次填入整型变量的4个字节中。

没有评论: