C char数组和\ 0

时间:2018-04-27 01:29:39

标签: c c-strings buffer-overflow

在C中,如果我初始化一个这样的char数组:

char lines[5];
memcpy((char *)line,"Hello",5)

然后,如果我执行以下表达式:

line[6]='\0';

这会导致缓冲区溢出吗?感谢?

3 个答案:

答案 0 :(得分:1)

很多问题。首先,为什么要转换为char *,当数组衰减时?其次,您需要使用从零开始的索引,而不是基于一个索引;数组a的第一个元素是a[0]而不是a[1]

此外,您应该将缓冲区大小设置为6而不是5,以便为终结符

腾出空间

答案 1 :(得分:0)

  

然后,如果我执行以下表达式:

line[6]='\0';
     

这会导致缓冲区溢出吗?

是。因为lines包含五个字符而您正在覆盖第七个字符。

  

comp [er]会为'lines'分配8个字节吗?

没有

它可能在lines之后放置3个字节的填充,在这种情况下,它仍然是缓冲区溢出,因为lines仍然是5个字节长。

答案 2 :(得分:0)

你肯定是在数组的边界之外写的,这会导致未定义的行为。结果可能是以下任何一种:

  • 运行时错误(segfault);
  • 损坏的数据(覆盖另一个对象的一部分);
  • 表现完全符合预期

大多数平台都有对齐要求,这样在数组的末尾和内存 1 中的下一个对象之间可能会有一些未使用的字节,并且在数组的末尾写入一个或两个字节是#39;很大的问题。但这与编译器分配"额外空间"不同。对于阵列。

<小时/>

  1. 假设数组大小不是2或4个字节的倍数,无论如何。