I want to dynamically generate a two-dimensional array and initialize it to a specific integer value.So I coded it as follows.
#include <vector>
#include <algorithm>
#include <stdio.h>
#include <iostream>
#include <string>
#include <stack>
#include <queue>
#include <tuple>
using namespace std;
int main(){
// map 입력받기
int N,M;
cin>> N >> M;
int** map_= new int*[N];
for(int i=0; i< N; i ){
map_[i]=new int[M];
}
fill(&map_[0][0], &map_[N][M], 2);
cout << " map[0][0] " << map_[0][0] << endl;
int** visit= new int*[N];
for(int i=0; i< N; i ){
visit[i]=new int[M];
}
fill(&visit[0][0], &visit[N-1][M-1], 0); // -1 : 진입 불가, 0 : 방문 안함, 1>= : 방문
return 0;
}
A segmenation error occurs. What's the reason? please reply
The below code generated in a static array works.
#include <iostream>
#define MAX 5
using namespace std;
int matrix[MAX][MAX] = {0,};
int main(){
fill(&matrix[0][0], &matrix[MAX][MAX], 2);
for (int i=0; i<MAX; i){
for (int j=0; j<MAX; j){
cout << matrix[i][j] << " ";
}
cout << endl;
}
return 0;
}
what is difference??
CodePudding user response:
Static 2D arrays are stored consecutively in memory (essentially being a single dimensional array of size N * M), thus the fill
function works fine on them. Contrarily, dynamic array are not stored the same way, each row could be stored anywhere in memory, and thus fill
will not work on them. You will need to loop over the array yourself, and fill each row individually.
Example:
int** map_= new int*[N];
for(int i=0; i< N; i ) {
map_[i]=new int[M];
fill(&map_[i][0], &map_[i][M], 2);
}
CodePudding user response:
Since map_
is an array of pointers, there is no reason the array should be contiguous. The first pointer that's allocated may point to memory location 5
, and the next to 352 M
rather than 5 M
. The solution is to use a vector of vectors instead of an array:
std::vector<std::vector<int>> map_(N, std::vector<int>(M, initial_value));
In your case, you would do:
std::vector<std::vector<int>> map_(N, std::vector<int>(M, 2));
CodePudding user response:
I think the error in the first fill() function , please try &map_[N-1][M-1] instead of &map_[N][M]