티스토리 뷰
결론 명시적인 것이 좋은건가?에 따라 다름 ( ∴ 안해줘도 됨 )
이말은 `형변환이 필요없다`는 뜻이 아니고 `할 필요가 없다`는 뜻입니다
우리는 malloc 함수의 리턴값이 void * 라고 배웠습니다.
명시적으로 형변환을 해줄 수 있다는 것도 알았구여 자동적으로 형변환이 된다는 걸 알고 있죠
자 아래 예시는 2차원 동적할당입니다. easy하죠
#include < stdio.h > int main() { // 2차원배열 만들기 (n X n) int n = 5; int ** arr; int i; arr = (int **)malloc(sizeof(int *) * n); // n만큼 2차원 배열 만들어줌, n의 크기는 1차원 for(i=0; i < n; ++i) arr[i] = (int *)malloc(sizeof(int) * n); // n만큼 1차원 배열 만들어줌, n의 크기는 0차원 return 0; }
anyway..
왜 이런글을 썼을까요?
바로 오류경험이 있기 때문이죠 (이상한 글 여기서 확인)
결론을 또 말하자면 에러(실수)를 줄이기 위해서 명시적 형변환을 추천하기 때문입니다
Explicit is better than implicit
때는 코드수를 줄일려고 형변환을 안하고 코딩을 하던 요즘이었습니다
200줄에 가까운 코딩을 하도록 만든 문제가 있었어요 (╯°□°)╯︵ ┻━┻
위의 예시처럼 malloc 앞에 명시적 형변환을 해주지 않고 코딩을 하다가
Segmentation fault라는 오류를 접했습니다 (삽질한 글 확인)
이렇게 해버린 겁니다
// 2차원 포인터에 0차원의 공간을 n만큼 만들어버림 arr = malloc(sizeof(int) * n);
물론 명시적 형변환을 안해줬더라도
"아 나는 `arr`이란 변수는 2차원 배열인걸 알고있다구" 라고 코딩을 했으면
통과했을 코드이죠. 하지만 코드가 길어지면서 저런 생각이 날아간겁니다
사실 이 문제에 대해서 의견이 많이 갈립니다
http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc
[번역] malloc의 결과값을 형변환 해줘야 하냐?
동적할당 스타일이 다 다르기 때문이죠
malloc 쓰는 몇가지 방법
// 1번 명시적 형변환 O arr = (int **)malloc(sizeof(int *) * n); // 2번 명시적 형변환 X arr = malloc(sizeof(int *) * n); // 3번 명시적 형변환 X, 타입 크기를 (* arr)을 이용 arr = malloc(sizeof(* arr) * n); // 외국인 칭구들은 간단히 3번처럼 쓰는거 같아여 // 1차원 배열을 동적할당 하고 싶으면 int * arr = malloc(lenth * sizeof arr);
하지만 저는 오류를 경험했고
본인의 머리가 장기기억장치가 아님을 깨달으며( 저의 long-term memory는 존재하지 않는걸까요 )
명시적 형변환 방식이 더 좋다는 것에 공감해요
의견에 동감해요 Ron Burk 님 👍
음.. 여기서 살짝 다른 이야기로 가자면,
그 동적할당한 메모리를 어떻게 쓰느냐에 따라 malloc을 쓸지 다른 함수를 쓸지 고려할 수 있습니다.
우리는 일반적으로 동적할당을 할 때, 처음 배운게 malloc이기 때문에 써왔습니다 (하지만 malloc만 있는게 아니죠)
다른 유용한 함수가 나의 코드에 더 효과적일 수 있습니다 (글을 한번 더 쓰려는 속셈! : 다음글에서)