C ++ 2D 동적 배열 충돌
-
10-07-2019 - |
문제
안녕하세요 저는 2D 동적 배열에 문제가 있습니다.
int main()
{
double **M;
int M_dimension;
int i;
M_dimension = 10;
M = new double *[M_dimension];
for (i=0;i<M_dimension;i++)
{
M[i] = new double[M_dimension];
}
M[0][0] = 1.0;
...
}
프로그램은 작동하지만 이러한 함수를 사용하여 2D 배열을 초기화하고 싶습니다.
void initialize2D(double **M,int M_dimension)
{
int i;
M = new double *[M_dimension];
for (i=0;i<M_dimension;i++)
{
M[i] = new double[M_dimension];
}
}
마지막으로 프로그램은 다음과 같습니다.
int main()
{
double **M;
int M_dimension;
int i;
M_dimension = 10;
initialize2D(M,M_dimension);
M[0][0] = 1.0; //crash
...
}
불행히도 그것은 충돌합니다 M[0][0] = 1.0;
도움이나 제안에 감사드립니다.
해결책
당신은지나 가고 있습니다 M
참조 대신 가치에 따라. initialize2D
포인터 간 포인터의 값을 변경해야합니다 M
할당 된 메모리를 가리 킵니다
대신 기능 서명을 변경해보십시오.
void initialize2D(double **&M,int M_dimension)
또는
void initialize2D(double ***M,int M_dimension) {
...
*M = new double *[M_dimension];
...
}
다른 팁
참조를 전달해야합니다 double**
대신에 double**
기능을 위해, 그렇지 않으면 m을 할당 한 후 포인터로 수행 된 수정. new
함수에서 빠져 나갈 때 길을 잃습니다.
문제는 int m_dimension void initialize2d (double ** m, int m_dimension)와 같은 정수 매개 변수를 선언하는 곳입니다.
그리고 동적 배열을 다음과 같이 초기화합니다. m [i] = new double [m_dimension];
가변 m_dimension을 정수로 선언 한 다음 더블로 사용했기 때문에 모순되는 곳
이 방법으로 시도해보십시오 : 데이터 유형의 배열 또는 m_dimension을 변경 한 다음 둘 다 동일한 데이터 유형을 갖습니다.
바라건대 이것은 당신을 도울 것입니다
왜 사용하지 않습니까? std::vector
또는 Boost.multiarray
2 차원 배열을 다음과 같이 정의하는 것은 매우 쉬운 운동입니다. C ++의 벡터의 일반 벡터