*((int *)voidp)++ 에러 질문

high385의 이미지

int imsi6[3] = {6, 3, 7};
int *imsip22;

imsip22 = imsi6;
void *voidp = imsip22;

printf("1. %x %x\n", (int *)voidp, (int *)voidp +1);
printf("1. %x %x\n", (double *)voidp, (double *)voidp +1);
//printf("1. %x\n", (int *)voidp++); // 'void *' : unknown size 에러 발생
//printf("%d\n", *((int *)voidp)++); // '++' needs l-value
printf("2. %d\n", *(int *)voidp);

위의 주석 처리한 두 부분에서 ++로 인한 에러가 발생하는데요 이유를 모르겠습니다.

아시는 분은 설명 부탁드립니다.

익명 사용자의 이미지

첫번째 주석
//printf("1. %x\n", (int *)voidp++); // 'void *' : unknown size 에러 발생

연산자 우선순위에 의해서 voidp++ 연산이 (int*)보다 먼저 실행되는 과정에서
void형이라 ++형으로 증가시킬때 증가값을 알 수 없으므로 에러가 발생하는거 같네요;

두번째 주석
//printf("%d\n", *((int *)voidp)++); // '++' needs l-value

이 주석은 에러가 발생하지 않습니다. 단지 형변환이 된 후 voidp가 가리키는 주소값(imsi6)의
주소값이 제일 마지막에(printf문이 모니터 배열의 첫번째 값 6을 출력한 후 ) 에 4byte증가하게 됩니다.
따라서 두번째 주석 바로 아래에
printf("1. %d\n", *((int *)voidp));

을 이용해서 그대로 한번 더 출력해 보신다면 주소값의 증가로 인하여
두번째 배열요소인 3이 출력되게 됩니다.

100%확실한 대답은 아닙니다. 조금이나마 도움이 되셨으면 좋겠네요;

HDNua의 이미지

1. 이 문제에 대해서는 위 익명 분의 설명과 같은 의견입니다.

2. 이것과 관련 있어 보이는군요.
https://kldp.org/node/152942#comment-612074

증감 연산자는 좌변값(l-value)에만 적용 가능한데,
제 생각엔 캐스트 연산자는 r-value를 반환하고, 따라서 ((int *)voidp)가 r-value가 됨으로써
l-value가 아닌 상태가 되었기 때문에 컴파일 에러가 발생한 것으로 보입니다.
Visual Studio 2015에서는 특수하게 처리하는지 컴파일이 되는 모양인데요.

피드백 환영합니다.

저는 이렇게 생각했습니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.