본문 바로가기

Algorithm/C프로그래밍

[C언어] 흔하게 발생하는 잘못된 포인터 사용

반응형

* 출처: 코딩도장 34.7 잘못된 포인터 사용

* 출처: 최유경 교수님 C 프로그래밍 포인터 수업자료 

 

▶ 1. 포인터 변수에 직접 값을 입력하는 경우

 

포인터는 메모리 주소를 저장하는 용도이다.

따라서 값을 직접 저장하면 안 된다. 

메모리에서 0x100은 잘못된 주솟값이므로 제대로 실행되지 않는다.

때문에 이 상태에서 numPtr을 역참조하여 메모리 주소에 접근해봐야 에러만 발생한다.

아래와 같은 오류 메시지가 발생한다.
- E0144: "int" 형식의 값을 사용하여 "int *" 형식의 엔터티를 초기화할 수 없습니다.
- C2440: '초기화 중': 'int'에서 'int *'(으)로 변환할 수 없습니다.
※ 정수 계열 형식에서 포인터 형식으로 변환하려면 reinterpret_cast, C 스타일 캐스트 또는 함수 스타일 캐스트가 필요합니다.

 

그런데 만약 실제로 존재하는 메모리 주소라면 포인터에 직접 저장할 수 있다.


▶ 2. 포인터를 선언만 하고 변수와 연결하지 않는 경우 (& x)

포인터 변수에는 쓰레기 값만 들어있게 되므로 오류가 발생한다.

반드시 어떤 변수에 & (주소 연산자)로 연결한 후 사용하여야 한다.

출처: 최유경 교수님의 강의 자료

□ 널(NULL) 포인터

- 주소 값 0을 나타내는 특별한 기호.

- 아무것도 가리키지 않음을 의미

- NULL의 값은 0이므로, 조건문에서 사용하면 거짓에 해당

- 예기지 못한 오류 방지를 위해 포인터 변수를 NULL로 초기화(int *pnum = NULL;)


▶ 3. &(주소연산자)와 *(참조연산자)의 사용 범위

- &(주소연산자): 포인터를 포함한 모든 변수에 사용 가능함

- *(참조 연산자): 포인터 변수에서만 사용 가능 (*num(num이 가리키는 변수)은 정의되지 않음)


▶ 4. 대입(연결) 시 자료형은 일치해야 한다.

- 포인터의 자료형과 연결된 변수의 자료형은 일치해야 한다.

- 서로 다른 자료형의 포인터 간 대입 시, 문법적으로는 경고만 발생하더라도 프로그램 오류의 원인이 된다.


▶ 5. 포인터의 크기

자료형 마다 크기가 다르다.

그러나 포인터의 경우, 포인터의 종류(자료형)에 상관없이 주소를 저장하기 위해 필요한 공간이 동일하다.

 

포인터의 크기는 시스템에 따라 (32비트 혹은 64비트) 다를 수 있다.

반응형