C언어 이차원배열 동적할당에 관해서 질문있습니다.
글쓴이: shockwave7 / 작성시간: 목, 2012/03/29 - 11:52오후
안녕하세요
C언어에서 이차원 배열을 동적할당으로 생성 하였습니다.
값을 초기화 할때 생성후에 함수 인자로 넘겨서 함수에서 값을 초기화 시키고
다시 메인에서 출력시키면 프로그램이 죽어 버립니다. APPCRASH 이벤트가 생기면서 프로그램 닫기가 뜨네요...
메인에서 초기화 시킨뒤에 출력시키면 제대로 출력되구요...
함수에서 초기화 시키고 출력문까지 넣어서 출력시키면 또 되네요...
혹시 포인터를 잘못 넘긴건가 싶어서 동적할당 말고 정적할당으로 생성시켜서 해보면 또 되네요...
어떻게 해결해야 할까요? 제가 모르고 있는 뭔가가 있는것 같습니다 ㅠㅠ
생각을 해봐도 해결방법이 잘 떠오르지 않네요 고수님들의 도움을 부탁드립니다 ㅠㅠ
소스는 아래와 같습니다.
#include <stdio.h> #include <stdlib.h> #define MAXSIZE 5 void InputValue(int (*_arr)[MAXSIZE], int _arrHeight, int _arrWidth) { int arrHeight = _arrHeight; int arrWidth = _arrWidth; int i,j; // 값 입력 for(i=0;i<arrHeight;i++) { for(j=0;j<arrWidth;j++) { _arr[i][j] = 1; } } } int main(void) { int arrHeight, arrWidth, i,j; int **arr; arrHeight = MAXSIZE; arrWidth = MAXSIZE; // 2차원 배열 동적 할당 (가로 x 세로 : MAXSIZE x MAXSIZE) arr = (int**)malloc(sizeof(int)*arrHeight); for(i=0;i<arrHeight;i++) { arr[i] = (int*)malloc(sizeof(int)*arrWidth); } InputValue(arr, arrHeight, arrWidth); // 배열에 값을 입력 // 값 출력 for(i=0;i<arrHeight;i++) { for(j=0;j<arrWidth;j++) { printf("%d ",arr[i][j]); } printf("\n"); } for(i=0;i<arrHeight;i++) { free(arr[i]); } free(arr); return 0; }
디버깅 해서 한 라인씩 돌려보면 메인에서 출력할때부터 문제가 발생합니다.
Forums:
아래의 입력형식을 참고해서 코드 구문으로 감싸
아래의 입력형식을 참고해서 코드 구문으로 감싸 주세요. 소스가 제대로 안떠요..-_-
피할 수 있을때 즐겨라! http://melotopia.net/b
앗... 깜빡하고 그냥 올려버렸네요
앗... 깜빡하고 그냥 올려버렸네요 ㅠㅠ
수정했습니다!
// 2차원 배열 동적 할당 (가로 x 세로 :
// 2차원 배열 동적 할당 (가로 x 세로 : MAXSIZE x MAXSIZE)
arr = (int**)malloc(sizeof(int)*arrHeight);
이부분을
// 2차원 배열 동적 할당 (가로 x 세로 : MAXSIZE x MAXSIZE)
arr = (int**)malloc(sizeof(int*)*arrHeight);
로 변경해서 해보세요~
혹시 운영체제가 64bit이세요?
흘러가고있는 지금 이 시간에 충실하자.
바꿔도 똑같네요 ㅠㅠ 윈도우7 64비트 입니다 ㅠ
바꿔도 똑같네요 ㅠㅠ 윈도우7 64비트 입니다 ㅠ
저도 극강 초보이긴 합니다만 혹시 위의
저도 극강 초보이긴 합니다만
혹시
위의 kgcrom님께서 말씀하신것과 함께
void InputValue(int (*_arr)[MAXSIZE], int _arrHeight, int _arrWidth)
이 구문을
void InputValue(int **_arr, int _arrHeight, int _arrWidth)
이렇게 바꾸면 되지 않을까요 ?
빙고!
리눅스에서는 (*_arr)[MAXSIZE] 이부분 자체가 에러가 뜨는데..허허.
2차 배열 할당 받을 때
arr = (int**)malloc(sizeof(int)*arrHeight);
를
arr = (int**)malloc(sizeof(int*)*arrHeight);
가 아닐까 조심스럽게 생각해봅니다.
오래됬지만 도움이 될것 같아 댓글답니다.
저도 2차원 포인터를 처음 구현할때 같은 고민을 했었는데, 윗분들이 답을 다 해주셨네요.
첫번째 height 할당때는 int* 의 크기를 할당해야 합니다.
그리고, 디버깅 하시면서 증가하는 주소값을 확인해보면 명확하게 이해하실수 있을겁니다.
참고로, 포인터에 관한 설명입니다.
http://unixwiz.net/techtips/reading-cdecl.html
언제나 시작
댓글 달기