*((int *)voidp)++ 에러 질문
글쓴이: high385 / 작성시간: 금, 2015/09/04 - 10:07오전
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);
위의 주석 처리한 두 부분에서 ++로 인한 에러가 발생하는데요 이유를 모르겠습니다.
아시는 분은 설명 부탁드립니다.
Forums:
댓글이 없길래..
첫번째 주석
//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%확실한 대답은 아닙니다. 조금이나마 도움이 되셨으면 좋겠네요;
의견
1. 이 문제에 대해서는 위 익명 분의 설명과 같은 의견입니다.
2. 이것과 관련 있어 보이는군요.
https://kldp.org/node/152942#comment-612074
증감 연산자는 좌변값(l-value)에만 적용 가능한데,
제 생각엔 캐스트 연산자는 r-value를 반환하고, 따라서 ((int *)voidp)가 r-value가 됨으로써
l-value가 아닌 상태가 되었기 때문에 컴파일 에러가 발생한 것으로 보입니다.
Visual Studio 2015에서는 특수하게 처리하는지 컴파일이 되는 모양인데요.
피드백 환영합니다.
저는 이렇게 생각했습니다.
댓글 달기