fill_n() 不允许更改变量值
Posted
技术标签:
【中文标题】fill_n() 不允许更改变量值【英文标题】:fill_n() is not letting change variable value 【发布时间】:2015-05-26 15:56:33 【问题描述】:我正在使用 fill_n() 函数来初始化我的数组值,但是我无法更改数组的值,它始终是初始值。
谁能解释一下这是为什么?
#include<iostream>
#include<ctime>
int main()
//Matrix
int m[3][3] = 1,0,0,0,1,0,0,0,1;
int v[3] = 5,6,7;
int result[3];// = 0,0,0;
int n = 0, i, j;
std::fill_n(result,sizeof(result),0);
clock_t time = clock();
while(n<1000)
n++;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
result[j] = result[j]+(v[i]*m[j][i]); //changing the values here.
time = clock() - time;
for(i=0;i<3;i++)
std::cout<<result[i]<<"\n";
std::cout<<"Execution time: "<<((float)time)/CLOCKS_PER_SEC<<"\n";
return 0;
代码的输出总是0。
【问题讨论】:
【参考方案1】:std::fill_n(result,sizeof(result),0);
您要求将第一个 sizeof(result)
元素填充 0。
但是,result
中只有 3 个元素可用。因此,您编写越界并导致未定义的行为。你应该改写std::fill_n(result, sizeof(result) / sizeof(result[0]), 0);
。
请注意,sizeof(result)
在 bytes 中返回 result
的大小,而不是在 元素 中。
【讨论】:
【参考方案2】:sizeof(result)
返回变量result
保存的字节数。由于result
是一个由 3 个int
s 组成的数组,它在内存中的大小为3 * sizeof(int)
,它(除非sizeof(int)
是1
)比3
大得多。因此,您正在编写传递数组边界并引发未定义的行为。
计算大小的实际方法是将result
的整个大小除以其元素类型。即sizeof(result) / sizeof(int)
。
如果你想将每个元素初始化为0
,一个更简单的方法是value-initialize数组:
int result[3]; // or = (pre C++11)
【讨论】:
【参考方案3】:type 类型的 array 的元素数(或大小)将为 sizeof(array) / sizeof(type )。 fill_n 所需的第二个参数是填充容器的元素数(在您的情况下,是 int 类型的数组),而不是数组的大小(以字节为单位)。当然,sizeof(array) 返回 sizeof(type) 乘以元素数。
【讨论】:
以上是关于fill_n() 不允许更改变量值的主要内容,如果未能解决你的问题,请参考以下文章