-
반응형
포인터를 사용할 때 자주 발생하는 실수
- 포인터를 사용할 때 * 연산자의 사용 여부에 따라 두가지 표현 가능
- 번지지정 연산자 *를 사용해야 하는 곳에서 실수로 누락하면 문제 발생
char *ptr; ptr = &data; // 첫 번째 표현 *ptr = 2; // 두 번째 표현
저번 포스팅의 Swap 함수를 기준으로 설명. (링크)
void Swap(int *pa, int *pb) { int temp = *pa; // *pa(start) = 96, *pb(end) = 5 *pa = *pb; // *pa(start) = 5, *pb(end) = 5 *pb = temp; // *pa(start) = 5, *pb(end) = 96 }
실수 유형1 : 하나의 * 연산자를 누락하는 경우, 컴파일 오류 발생
pa = *pb; *pa = pb;
실수 유형2 : 모든 * 연산자를 누락하는 경우, 컴파일 시에 오류 발생 안함(=논리적 오류)
int temp = *pa; // *pa(start) = 96, *pb(end) = 5 pa = pb; // pb에 저장된 주소가 pa에 복사되어 pa도 end를 가리킴 *pb = temp; // *pa(start) = 96, *pb(end) = 96
이러한 실수를 막고자 const 키워드로 주소 변경에 대한 버그를 대처할 수 있다.
const 키워드로 주소 변경 실수 막기
const 키워드를 이용하여 피호출자에서 호출자로부터 전달받은 주소를 변경하는 실수를 방지
void Swap(int * const pa, int * const pb) int temp = *pa; pa = pb; // pa는 const 변수이기 때문에 오류 발생 *pb = temp;
포인터 변수에서 const 키워드를 사용하는 여러 가지 방법
포인터 변수는 const 키워드를 사용할 수 있는 위치가 두 곳
위치를 조합하여 const 키워드를 사용한 포인터 변수를 세가지 방법으로 선언 가능
포인터 변수를 다룰 때 실수할 확률이 높기 때문에 const 키워드를 적절하게 활용하면 실수로 인한 버그를 줄일 수 있음
int * const p;
p가 가지고 있는 주소를 변경하면 번역할 때 오류 발생
int data = 5, temp = 0; int * const p = &data; // 초기화때는 받아줌 *p= 3; p = &temp; // 오류 발생, 이후에 변경불가
const int *p;
*p를 사용하여 대상의 값을 변경하여 번역할 때 오류 발생
int data = 5; const int *p = &data; // 변수 p는 data 변수의 주소를 저장 *p = 3; // 오류 발생, 변수 p가 가리키는 대상의 값 변경 불가
const int const *p;
p가 가지고 있는 주소를 바꾸거나, *p를 사용하여 대상의 값을 변경하면 번역할 때 오류 발생
int data = 5, temp = 0; const int * const p = &data; // 변수 p는 data 변수의 주소를 저장 *p = 3; // 오류 발생, 변수 p가 가리키는 대상의 값 변경 불가 p = &temp; // 오류 발생, 이후에 변경불가
반응형'C' 카테고리의 다른 글
포인터 변수의 주소 연산 (0) 2022.05.16 포인터(Pointer) -2 (0) 2022.05.14 포인터(Pointer) -1 (0) 2022.05.13