【发布时间】:2016-04-01 06:11:09
【问题描述】:
可以在 question 和 here 中找到有关这方面的讨论,但我的情况略有不同,因为我正在处理动态分配的内存。
另请注意,memset 与 double 值不完全匹配。
无论如何,我正在尝试使用std::fill 来填充动态分配的二维数组--
#include <iostream>
#include <algorithm>
using std::cout ; using std::endl ;
using std::fill ;
int main()
{
double **data ;
int row = 10, col = 10 ;
data = new double*[row] ;
for(int i = 0 ; i < col ; i++)
data[i] = new double[col];
// fill(&(data[0][0]),
// &(data[0][0]) + (row * col * sizeof(double)), 1); // approach 1
// fill(&(data[0][0]), &(data[0][0]) + (row * col), 1); // approach 2
// fill(data, data + (row * col * sizeof(double)), 1); // approach 3
// fill(&(data[0][0]),
// &(data[0][0]) +
// ((row * sizeof(double*)) +
// (col * sizeof(double))), 1); // approach 4
for(int i = 0 ; i < row ; i++) {
for(int j = 0 ; j < col ; j++)
cout << data[i][j] << " " ;
cout << endl ;
}
for(int i = 0 ; i < row ; i++)
delete [] data[i] ;
delete [] data ;
}
方法一:据我了解,方法一应该是正确的代码,我是从开头&(data[0][0])开始,数组的结尾应该位于&(data[0][0]) + (row * col * sizeof(double)),但是当我运行时,我得到了这个错误,但是数组已经被填充了--
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
*** Error in `./test': free(): invalid next size (fast): 0x0000000000da3070 ***
Aborted (core dumped)
Approach 2: 但是,根据这个post,建议使用方法2,但是我不太明白这段代码,因为缺少sizeof(double),我得到了这个输出--
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
*** Error in `./test': free(): invalid next size (fast): 0x0000000000bf5070 ***
Aborted (core dumped)
方法3:不知道为什么这样编译不通,data和&(data[0][0])应该是同一个意思吧?
方法4:我不确定这是否正确。
- 我该怎么做?
-
std::fill是否比两个嵌套循环有任何额外的好处?
【问题讨论】:
标签: c++ arrays c++11 dynamic-memory-allocation