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

2.2.2 差一錯誤

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


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  }

這些錯誤中,很多都是新手易犯的錯誤,但經(jīng)驗(yàn)豐富的程序員也可能犯同樣的錯誤,很容易開發(fā)出并部署類似于這個例子的程序,因?yàn)樗诖蠖鄶?shù)系統(tǒng)上都可以順利通過編譯并且運(yùn)行時也不報錯。

主站蜘蛛池模板: 三明市| 和田市| 建宁县| 巴彦县| 扎鲁特旗| 新沂市| 环江| 武隆县| 长丰县| 准格尔旗| 赫章县| 东平县| 浮山县| 衢州市| 丁青县| 江陵县| 通州市| 类乌齐县| 盘山县| 南溪县| 静乐县| 连州市| 梁河县| 修文县| 临沂市| 吉木萨尔县| 洞头县| 含山县| 永新县| 南通市| 博乐市| 珠海市| 麻阳| 宁津县| 阿瓦提县| 清流县| 怀化市| 长顺县| 磴口县| 东光县| 上杭县|