티스토리 뷰

학습자료

C, malloc 시 꼭 형변환 해줘야하는가?

알 수 없는 사용자 2017. 1. 7. 00:22

결론 명시적인 것이 좋은건가?에 따라 다름 ( ∴ 안해줘도 됨 )

이말은 `형변환이 필요없다`는 뜻이 아니고 `할 필요가 없다`는 뜻입니다


우리는 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만 있는게 아니죠)


다른 유용한 함수가 나의 코드에 더 효과적일 수 있습니다 (글을 한번 더 쓰려는 속셈! : 다음글에서)




댓글
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크