官术网_书友最值得收藏!

2.2.2 差一錯誤

空字符結尾的字符串的另一個常見問題是差一錯誤(off-by-one error)。差一錯誤與無界字符串復制有相似之處,即都涉及對數組的越界寫問題。下列程序在微軟Visual C++2010的/W4警告級別上完全可以編譯和鏈接,并且在Windows 7上運行時也不報錯,但它包含了幾個差一錯誤。你能找出這個程序中所有的差一錯誤嗎?


01  #include <string.h>
02  #include <stdio.h>
03  #include <stdlib.h>
04
05  int main(void) {
06    char s1[] = "012345678";
07    char s2[] = "0123456789";
08    char *dest;
09    int i;
10
11    strcpy_s(s1, sizeof(s2), s2);
12    dest = (char *)malloc(strlen(s1));
13    for (i=1; i <= 11; i++) {
14      dest[i] = s1[i];
15    }
16    dest[i] = '\0';
17    printf("dest = %s", dest);
18    /* ... */;
19  }

這些錯誤中,很多都是新手易犯的錯誤,但經驗豐富的程序員也可能犯同樣的錯誤,很容易開發出并部署類似于這個例子的程序,因為它在大多數系統上都可以順利通過編譯并且運行時也不報錯。

主站蜘蛛池模板: 银川市| 陇西县| 沙坪坝区| 怀远县| 宁武县| 崇文区| 林芝县| 汉川市| 嘉禾县| 石首市| 阳朔县| 南丰县| 集安市| 长泰县| 当阳市| 长泰县| 科技| 独山县| 永春县| 民丰县| 秭归县| 左云县| 鄂伦春自治旗| 广饶县| 佛坪县| 固始县| 淳化县| 阳西县| 海晏县| 杭锦后旗| 那坡县| 琼结县| 阿拉善左旗| 五大连池市| 买车| 广昌县| 宜宾市| 商丘市| 香格里拉县| 望江县| 德清县|