繁体   English   中英

关于C ++中的stl填充功能的问题

[英]question on stl fill function in C++

假设我有一个像这样的数组:

string x[2][55];

如果我想用“ -1”填充它,这是正确的方法:

fill(&x[0][0],&x[2][55],"-1");

当我尝试运行它时崩溃了。 如果我将x [2] [55]更改为x [1] [54],则可以使用,但不会初始化数组的最后一个元素。

这是一个证明我的观点的例子:

  string x[2][55]; 
  x[1][54] = "x";
  fill(&x[0][0],&x[1][54],"-1");
  cout<<x[1][54]<<endl; // this print's "x"

因为当您拥有多维数组时,第一个元素之后的地址有点难以计算。 简单的答案是您执行以下操作:

&x[1][55]

让我们考虑一下二维数组x[N][M]在内存中的布局

[0][0] [0][1] ... [0][M-1] [1][0] [1][1] ... [1][M-1] [N-1][0] .. [N-1][M-1]

因此,最后一个元素为[N-1][M-1] ,之后的第一个元素为[N-1][M] 如果您使用[N][M]的地址,那么您将远远超过结尾并且覆盖了很多内存。

计算末尾第一个地址的另一种方法是使用sizeof。

&x[0][0] + sizeof(x) / sizeof(std::string);

从形式和学究的角度来看,这是非法的。 将2D数组重新解释为1D数组会导致未定义的行为,因为您实际上是在尝试访问1D x[0]数组的边界之外的内容。

在实践中,这将起作用(尽管某些代码分析工具可能会将报告视为违规)。 但是,为了正确指定指向“超出最后一个元素”的指针,您必须要小心。 可以将其指定为&x[1][55]&x[2][0] (都是相同的地址)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM