int temp = 0; int *temp_p; temp_p = &temp; *temp_p = temp; printf("temp_p = %d, *temp_p = %d", temp_p, *temp_p); |
포인터 변수를 정의할 때의 '*'와
수식에서 사용할 때의 '*'는 다른 의미가 있다.
정의할 때 사용하는 '*'는 주소를 저장할 수 있는 변수를 할당 받는 것이고
수식 내에서 사용된 '*'는 변수에 대한 역참조(dereferencing)를 한다는 의미이다.
이는 역참조 연산자(dereferencing operator)라고 따로 부른다.
#include <stdio.h> int main() { int *temp_p; *temp_p = 1024; // Segmentatiion Fault 발생 printf("%d\n", *temp_p); return 0; } |
*temp_p = 1024
위문장은 문법적으로는 문제가 없지만 실행 시 문제를 발생한다.
temp_p는 주소를 저장할 수 있는 변수이다.
초기화를 하지 않았기 때문에 이 곳에는 쓰레기 값이 들어있다.
그리고 역참조 연산자 의미에 의해 위의 문장은 temp_p가 가리키는 곳에 1024라는 값을 넣는다.
결국 쓰레기 값, 즉 알 수 없는 곳에 1024라는 값을 넣게 되는 것이다.
그런데 그 쓰레기 값이 있는 곳을 시스템이 사용하고 있다면
시스템은 순간적으로 엉망이 될 것이다.
그 것을 막기 위해 컴파일러는 'Segmentation Fault'를 나타내는 것이다.
'정상을향해 > Languages' 카테고리의 다른 글
상속 (Inheritance) (0) | 2013.11.11 |
---|---|
얕은복사와 깊은복사 (0) | 2013.11.11 |
멤버 이니셜라이저를 이용한 멤버 초기화 (0) | 2013.11.11 |
C++에서의 파일분할 (7) | 2013.11.10 |
참조자(Reference)와 함수 (0) | 2013.11.10 |
[C] 포인터 : 배열명 (0) | 2011.04.16 |