C中的Off-by-One错误

时间:2017-03-15 04:40:47

标签: c standards

我正在尝试从书籍示例(CERT C编码标准)执行示例。书中的例子是完整的程序,而不是抽象的代码 RULE STR31-C:保证字符串的存储空间足以容纳字符数据和空终结符

 #include <stdio.h>
 #include <stddef.h>

enum {ARRAY_SIZE = 32 };
int main(void) 


char dest [ARRAY_SIZE] = {1,2,3,4,5};
char src[ARRAY_SIZE];
size_t i;   

for (i = 0;src[i] && (i < sizeof(dest)-1);++i)  
{
dest[i] = src[i];

}

dest [i] = '\0'; //this over writing the dest[0],Right?

printf("original -> copied \n");

for(i = 0; i < 5; ++i) 
{
  printf("   %2d        %2d\n", src[i], dest[i]);
}

  return 0;
}

输出:

original -> copied 
    0         0
    0         2
    0         3
    0         4
    0         5

问题1.我理解dest [0] - 重写&#39; \ 0&#39;。它不应该发生......如何修复或更改此设计。

问题2:src []都变为0.为什么?不能理解。或者我想念一些基本的东西:(

2 个答案:

答案 0 :(得分:1)

  

src []都变为0.为什么?不能理解。或者我想念一些东西   基本:(

您尚未将任何内容初始化为src

  

dest [i] ='\ 0'; //这个写了dest [0],对吧?

我的问题是你为什么这么认为?毕竟i不等于0

答案 1 :(得分:0)

固定。现在按预期工作。我的错。错误的src []和dest [] inter改变了。