c언어 malloc()을 이용한 배열 생성 관련 질문입니다.
글쓴이: phi / 작성시간: 월, 2016/08/01 - 7:10오전
c 기초 플러스로 c언어를 공부중입니다.
이 책의 12장에서
double *ptd;
ptd = (double *) malloc(30*sizeof(double));
이렇게 하면 ptd가 double형 값 30개를 가지는 블록을 가리키는 포인터가 아니라,
하나의 double형 값을 가리키는 포인터로 선언 된 것에 주목하라고 되어 있습니다.
이후 설명으로 ptd가 블록의 첫번째 원소를 가리키도록 설정되었고, ptd[0]으로 그 블록의 첫번째 원소에 접근할 수 있다고 합니다.
그런데 맨 처음 ptd를 double형 포인터로 선언하면 그 ptd에는 그 포인터가 가리킬 메모리의 주소가 대입되어야 하는거 아닌가요?
(double)이걸로 변수의 유형을 임시로 변경해서 사용하는 방법은 앞에서 언급한 적이 있어서 어느정도 알고는 있는데,
(double *)이렇게 포인터와 관련해서 사용하는건 처음이라 잘 이해가 안되는 것 같습니다.
어떤 변수가 있을 때 (double *)등과 같이 포인터 형태로 임시로 변경(정확한 이름을 몰라서 이렇게 표현합니다 ㅠㅠ)하면
그 변수가 할당된 메모리의 주소가 나타나는 건가요??
그게 아니라면 포인터로 선언된 ptd에 값을 대입하는 다른 방법이 있는건가요?
Forums:
아!
방금 다시 한번 천천히 읽어보니 malloc()함수의 리턴값이 블록의 첫번째 바이트의 주소값이라고 되어있네요!
그런데 이미 주소값이면 왜 (double)이 아니라 (double *)를 사용하는 건가요?
아..
자료형 변환이라고 하네요..
자료형 변환할때 *를 추가하면 주소로 자료형 변환을 한다... 처음 알았습니다..
뭔가 혼자 질문하고 혼자 알아보고, 너무 성급하게 글 쓴거 같긴 하지만, 넘어가주세요..
ㅎㅎ
ㅎㅎㅎㅎ
(뚜렷한 이유 없이 이딴 식으로 코딩하면 업계에서 매장당하려나...)
어떤 문제라도 있나요?
이 책에는 배열을 생성하는 세가지 방법중 하나로 이걸 제시하고 있습니다.
그리고 c99이전에는 가변 길이 배열을 형성할 수가 없는데,
이 방법을 이용하면 동적 배열을 형성 할 수 있으며, 가변 길이 배열보다 더 융통성이 하는데..
왜 업계에서는 이 방법을 쓰지 않는게 좋은거가요?
혹시, 이 책이 예전꺼라(5판이라 2005년이네요..) 현재는 더 나은 방법이 있어서 그런건가요?
아.
괜한 오해를 산 모양이네요. 질문자님의 코드를 보고 붙인 커멘트가 아닙니다.
malloc으로 배열을 할당받아 포인터(
double *
)로 받는 것은 흔한 용례입니다.제 커멘트는 제가 올려드린 비교적 안 흔한 용례(
double (*)[30]
로 받는 코드)에 대한 겁니다. 이 쪽도 사용 가능하고 별 문제는 없는데, 좀 더 번거롭고 덜 직관적이죠.감사합니다
답변 감사합니다!
더 공부할께요!
댓글 달기