A discussion along this line could be found in this question and also in here, but my case is slightly different, as I am dealing with a dynamically allocated memory.
also please note, memset does not quite work with double value.
Anyway, I am trying to use std::fill to fill a dynamically allocated 2D array --
#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 ; } Approach 1: What I understand, the approach 1 should be the correct code, I am starting from the beginning &(data[0][0]) and the end of the array should be located at &(data[0][0]) + (row * col * sizeof(double)), but when I run, I get this error, but the array has been filled --
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) Approrach 2: However, according to this post, the approach 2 is recommended, but I do not quite understand this code, since sizeof(double) is missing, and I am getting this output --
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) Approach 3: I am not sure why this does not compile, data and &(data[0][0]) should have the same meaning, right?
Approach 4: I am not sure if this is correct or not.
- How do I do it ?
- Does
std::fillgive any extra benefit over two nested loops?