[英]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.