2014-09-28 2 views
0

행렬에서 두 행을 교환하고 싶습니다. 내 행렬은 할당 된 솔리드 블록 메모리입니다. 행렬의 행을 가리키는 포인터 배열이 있습니다. 첫 번째 포인터는이 큰 할당 블록을 가리 킵니다. 다른 포인터는 다른 부분이나이 블록을 가리 킵니다.공통 포인터를 사용하여 할당 된 메모리로 포인터 바꾸기

첫 번째 행을 제외하고 두 행을 서로 바꿔도 괜찮습니다. 하지만 첫 번째 행에 문제가 있습니다. 첫 번째 행의 포인터가 다른 포인터와 다르기 때문입니다. 그러나 주요 차이점은 무엇입니까?

#include <iostream> 

int** allocateMatrix(int rows, int cols) { 
    // allocating array of pointers (rows) 
    int** matrix = new int*[rows]; 
    // allocating one solid block for the whole matrix 
    matrix[0] = new int[rows*cols]; 

    // setting the pointers for rows 
    for (int i = 1; i < rows; ++i) { 
     matrix[i] = matrix[i-1] + cols; 
    } 

    // fill the matrix with consecutive numbers 
    int k = 1; 
    for (int i = 0; i < rows; ++i) { 
     for (int j = 0; j < cols; ++j) { 
      matrix[i][j] = k; 
      k += 1; 
     } 
    } 

    return matrix; 
} 

void freeMatrix(int** matrix) { 
    delete[] matrix[0]; 
    delete[] matrix; 
} 

int main() { 
    int n = 3; 
    int m = 3; 
    int** matrix = allocateMatrix(n, m); 

    // swap the first and the second line 
    int* tmp = matrix[0]; 
    matrix[0] = matrix[1]; 
    matrix[1] = tmp; 

    // print matrix (it is printing ok) 
    for (int i = 0; i < n; ++i) { 
     for (int j = 0; j < m; ++j) { 
      std::cout << matrix[i][j] << ' '; 
     } 
     std::cout << std::endl; 
    } 

    // problem is here 
    freeMatrix(matrix); 

    return 0; 
} 
+0

'벡터 > 데이터'멤버를 포함하는 매트릭스 클래스를 만들고 데이터 변수 또는 그 행 중 하나에'std :: swap'을 호출하는 스왑 함수를 구현하십시오. –

답변

1

가장 큰 차이점은 첫 번째 포인터가 new[]에 의해 반환되었습니다. 해당 포인터를 삭제하면 전체 메모리 블록의 할당이 해제되지만 배열의 다른 포인터를 삭제하면 정의되지 않은 동작이 발생합니다.

new[]에서 가져온 포인터를 별도로 저장하고 행 포인터 배열에 보관하는 첫 번째 행에 "약한"포인터가있을 수 있습니다.

+0

감사합니다. 나는 그것에 대해별로 생각하지 않는다고 생각한다. 이제 알겠습니다. – klimenkov

0

matrix[0]을 사용하여 메모리 할당을 삭제하기 때문에 첫 번째 (0) 및 두 번째 (1) 행을 교체하면 코드가 작동하지 않습니다.

어떻게 든 원래 할당을 "유지"해야합니다.

int *origalloc; 

... 
origalloc = matrix[0] = new int[rows*cols]; 


... 
delete[] origalloc;  // Instead of malloc[0]; 

당신이 delete 또는 delete []에 전달해야 다시 new 또는 new []로부터 얻을 것과 같은 포인터 값. 다른 것은 정의되지 않은 동작입니다.

+0

감사합니다. 내가 두 번째 대답을 줄 수 있다면 나는 또한 당신에게 줄 것이다. – klimenkov