59.3 예제에서 에러가 납니다
, Jj Dmasteroong님이 작성void_pointer_arithmetic.c 파일입니다
#include <stdio.h>
#include <stdlib.h> // malloc, free 함수가 선언된 헤더 파일
int main()
{
void *ptr = malloc(100); // 100바이트만큼 메모리 할당
printf("%p\n", ptr); // 00FADD20: 메모리 주소. 컴퓨터마다, 실행할 때마다 달라짐
printf("%p\n", (int *)ptr + 1); // 00FADD24: 다른 포인터로 변환한 뒤 포인터 연산
printf("%p\n", (int *)ptr - 1); // 00FADD1C: 다른 포인터로 변환한 뒤 포인터 연산
void *ptr2 = ptr; // 메모리 주소를 변화시킬 때는 다른 포인터에 보관
printf("%p\n", ++(int *)ptr2); // 00FADD24: 다른 포인터로 변환한 뒤 포인터 연산
printf("%p\n", --(int *)ptr2); // 00FADD20: 다른 포인터로 변환한 뒤 포인터 연산
printf("%p\n", ((int *)ptr2)++); // 00FADD20: 다른 포인터로 변환한 뒤 포인터 연산
printf("%p\n", ((int *)ptr2)--); // 00FADD24: 다른 포인터로 변환한 뒤 포인터 연산
free(ptr);
return 0;
}
여기서 ++(int *)ptr2) 부분에서 lvalue required as increment operand 오류가 납니다.그런데 이상한 것은 (int *)ptr2 + 1로 해봤을 때는 정상적으로 연산이 된다는 겁니다.이건 무슨 문제인가요? 참고로 VS Code에서 gcc로 컴파일하고 있습니다.
Re: 59.3 예제에서 에러가 납니다
, 도장_ 관리자님이 작성포인터 연산의 개념을 보여주기 위한 예제입니다.
다른 포인터로 변환한 다음에 직접 연산하는 것을 GCC가 금지하기 때문입니다.
void *ptr2 = ptr; // 메모리 주소를 변화시킬 때는 다른 포인터에 보관
int *int_ptr = (int*)ptr2;
printf("%p\n", ++int_ptr); // 00FADD24: 다른 포인터로 변환한 뒤 포인터 연산
printf("%p\n", --int_ptr); // 00FADD20: 다른 포인터로 변환한 뒤 포인터 연산
printf("%p\n", int_ptr++); // 00FADD20: 다른 포인터로 변환한 뒤 포인터 연산
printf("%p\n", int_ptr--); // 00FADD24: 다른 포인터로 변환한 뒤 포인터 연산
명시적으로 *int_ptr를 선언하고, 임시 변환 형태를 모두 제거하면 문제 없이 실행됩니다.
0x96b010 0x96b014 0x96b00c 0x96b014 0x96b010 0x96b010 0x96b014결과입니다.
온라인에서 직접 결과를 보면 됩니다.
https://glot.io/snippets/flicw85ic1
왼쪽 C 아이콘을 클릭하면 컴파일 옵션을 볼 수 있습니다. clang이지만 gcc에서도 옵션은 동일합니다.