C char array and



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

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

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

line[6]='';

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

许多问题。首先,为什么要铸造到 char *,而那是阵列衰减的呢?其次,您需要使用基于零的索引,而不是基于一个基于索引的索引;数组a的第一个元素是a[0]不是a[1]

还应该将缓冲区大小设置为6而不是5,以腾出终结者的空间

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

line[6]='';

这会导致缓冲区溢出吗?

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

comp [il] er分配了8个字节的"线"?

no。

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

您肯定是在数组范围之外编写的,这导致了不确定的行为。结果可能是以下任何一个:

  • 运行时错误(segfault(;
  • 损坏的数据(另一个对象的覆盖部分(;
  • 行为完全按预期

大多数平台都有对齐要求,因此在数组的末尾和内存中的下一个对象之间可能存在一些未使用的字节这是很多问题。但这与编译器为阵列分配"额外空间"的编译器不同。


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

最新更新