1차원 배열을 2차원 배열로 변환하는 코드 작성 중 질문입니다.
글쓴이: fopenfclose / 작성시간: 목, 2015/12/17 - 12:30오전
1 2 3 4 5 6 7 8 9 를
1 2 3
4 5 6
7 8 9
이렇게 만들어서 반환하는 함수입니다.
int ** make2Dmatrix(const Matrix * A, int a_numRows, int a_numCols) { // MAKE 2D int ** afArr = (int **)malloc(sizeof(int) * a_numRows); if (afArr == NULL) { cout << "mem alloc fail(transpose)" << endl; return NULL; } for (int i = 0; i < a_numRows; i++) { afArr[i] = (int *)malloc(sizeof(int) * a_numCols); if (afArr[i] == NULL) { cout << "transpose mem alloc fail" << endl; return NULL; } memcpy(afArr[i], A->mat + (i * sizeof(int) * A->numCols), sizeof(int) * A->numCols); <- 테스트해보니 이 부분에서 문제가 일어납니다. // 1 2 3 까지는 복사가 되는데 그 다음부분이 전혀 // 복사가 되지 않습니다. 주소 연산이 잘 못된 것 같지 // 않은데 왜 안되는지 모르겠습니다. // 간절히 도움 부탁드립니다. } cout << endl; cout << "make2Dmatrix text" << endl; for (int i = 0; i < A->numRows; i++) { for (int j = 0; j < A->numCols; j++) { cout << afArr[i][j] << " "; } cout << endl; } return afArr; }
Forums:
포인터에 대한 산술 연산 오류 같네요..
예를 들어보겠습니다.
위 코드에서 (1) 과 (2) 중 잘못된 것이 어느것일까요?
(2)번이죠.
포인터에 대한 산술 연산은 주소값의 단순 증감가 아니라, **포인터가 가리키는 데이터의 크기만큼의 증감**이 이루어 집니다.
아마도 Matrix::mat는 포인터일테니,
이렇게 하는 것이 맞지 않을까요?
/* How to Love Others */
while(GetDepth(Love) < Enough) DoLove();
아 덕분에 실행 잘 됩니다.
가르쳐 주셔서 감사합니다. 좋은 배움 얻습니다.
64bit 기계에선 오동작할 것 같은데요. int
64bit 기계에선 오동작할 것 같은데요.
int **x = malloc(sizeof(int*) * num_rows)
혹은
int **x = malloc(sizeof(*x) * num_rows)
처럼.
답변 감사드립니다. 근데 (int *) 와
답변 감사드립니다.
근데 (int *) 와 (*x)의 차이는 무엇인가요??
(*x) 는 x 의 type 이 float** 으로
(*x) 는 x 의 type 이 float** 으로 바뀌더라도 수정할 필요가 없는 표현입니다.
실수 방지, 귀차니즘... 겸사겸사.
같은 방식으로,
보단
처럼 쓰는 걸 선호하는 편입니다.
기분내키면...
포인터는 단순히 주소 값만을 의미하는 것이 아니라.
그 타입으로써 가리키는 대상의 크기 정보도 가지고 있으므로,
가리키는 대상은 메모리 주소만이 아니라 그 크기 만큼의 메모리 공간 전부가 됩니다.
고로 +1을 하면 범위의 끝 바로 다음 주소로 이동이 되는 것입니다.
http://cafe.daum.net/codeinside
댓글 달기