【问题标题】:Weird way to increase the size of an array in C? [duplicate]在C中增加数组大小的奇怪方法? [复制]
【发布时间】:2014-02-25 07:33:30
【问题描述】:

我认为通常你不能增加数组的大小。 但如果我这样做:

字符 arr[4];

strncpy(arr,"12347777",8);

当我调用 strlen(arr) 时,它显示长度增加了。 有人可以向我解释那里发生了什么吗?

【问题讨论】:

  • 这种未定义的行为,写入超过分配缓冲区的末尾,通常称为 缓冲区溢出,是安全漏洞的最常见原因之一。

标签: c arrays strncpy


【解决方案1】:

您没有使数组变大。在数组结束后,您踩到了随机的内存块。

strlen 不返回数组的长度,即使在正常情况下也是如此。它表示一个字符串有多长。由于您只是在其中放置了 8 个字符(加上一个空终止符),因此它返回 8。但是,这是未定义的行为!因为你已经损坏了内存,你可能会崩溃,或者它可能会返回一个随机数(根据标准,一切皆有可能)。事实上,在一段不太简单的代码中,这可能会导致崩溃。

【讨论】:

    【解决方案2】:

    你刚刚犯了一个大错误。它可能导致内存损坏和程序行为不端。它不会改变真正的数组大小,但会覆盖数组所在的内存以及后面的内存。因此,您在数组中写入了四个字符 {'1', '2', '3', '4'},然后将 {'7', '7', '7', '7'} 写入以下内存。你很幸运,下一个字节被归零,所以strlen(arr) 显示你的大小为 8。这是简单的错误,你不应该这样做。注意"12347777" 是指向包含{'1', '2', '3', '4', '7', '7', '7', '7', '\0'} 的内存的指针,并且您只复制了 8 个字符,因此错过了终止零字节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-14
      • 2017-02-20
      • 2015-08-22
      相关资源
      最近更新 更多