• 2022. 5. 15.

    by. 데브촙

    반응형

    포인터를 사용할 때 자주 발생하는 실수

    - 포인터를 사용할 때 * 연산자의 사용 여부에 따라 두가지 표현 가능

    - 번지지정 연산자 *를 사용해야 하는 곳에서 실수로 누락하면 문제 발생

    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