void* 에 관하여

asleea의 이미지

void *a;
int *b;
a = b;

위의 코드와 같이 void*형에는 다른 타입의 포인터 형을 넣어도 문제가 없고

반대로 다른 타입의 포인터에 void포인터 형을 넣어주려면 아래와 같이

형 변환을 해주어야 된다고 알고있습니다.

void *a;
int *b;
b = (int*)a;

그런데 공부를 하다보니 예제 코드에서 형 변환 없이 사용을 하는 것이 많이 보이네요
형 변환을 해주어서 대입하는 것과 형 변환없이 대입하는 것이 어떤 차이점이 생기는 건가요.?
그리고 형 변환을 하지 않고 사용했을 때 문제는 없는 건가요 .?

익명 사용자의 이미지

C에서는 다른 타입에서 void * 형으로, 혹은 그 역으로의 변환이 자유롭습니다.
이는 void * 가 범용 포인터 역할을 하기 때문입니다.
따라서 이런 종류의 형변환에서는 생략해도 상관 없고, 오히려 생략하는게 더 좋습니다.

반면에 C++에서는 서로 올바른 상속관계가 아니면 꼭 형변환 연산자를 붙여줘야 합니다.

포인터로 어떤 타입을 마치 다른 타입인 양 쓸 수 있다는 것이 굉장히 강력해서
마구 남용하기가 쉬운데,
그런건 꼭 필요한 상황에서, 어쩔 수 없을때만 하는게 좋습니다.

익명 사용자의 이미지

그리고 포인터의 심도있는 이해를 위해서
메모리 주소의 정렬 제한이라는 것에 대해서 찾아보시고 공부를 해 보시길 권합니다.
이 개념을 알면 C포인터에 달린 많은 제한들에 대해서
좀 더 이해가 쉽게 됩니다.

asleea의 이미지

확인이 좀 늦었지만 감사합니다 .

malloc함수 사용시 return값이 void*라 항상 앞에 형변을 해주는 것을 볼 수 있는데 그럼

이 역시 형변환 없이 사용해도 상관이 없나요 .?

익명 사용자의 이미지

C에서는 빼고 되고 C++에서는 빼면 안됩니다.
양쪽에서 다 사용할 것을 염두에 두고 있다면 붙여야 합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.