다음 소스 코드를 보자. 이 코드에서 과연 에러가 날까?
1 : #include <stdio.h>
2 : int main(){
3 : int *p;
4 :
5 : *p = 1024;
6 : printf("%d\n", *p);
7 : return 0;
8 : }
이 코드는 중대한 문제점을 가지고 있다.
p는 어떠한 번지를 저장할 수 있는 변수이다.
그래서 처음에는 어떠한 쓰레기 값이 번지로 들어가게 된다.
(23984 라 가정하겠다.)
그런데 5번째 줄을 보면, 이 쓰레기 값이 주소인 곳 ( 23984 ) 에 1024를 넣으려 하고 있다.
이 코드는 실행했을 때에 아무런 에러가 없는 듯 보이지만,
만약 시스템에서 23984 라는 곳을 사용하고 있다면, "세그먼테이션 폴트"가 일어나게 되는 것이다.
이것은 다른 프로그램이 사용하는 메모리 영역을 건드렸음을 의미한다.
그러므로 위의 코드는 이러한 방법으로 수정하여 준다.
1 : #include <stdio.h>
2 : int main(){
3 : int *p, a;
4 : p = &a; //초기화로 번지를 할당해 준다.
5 : *p = 1024;
6 : printf("%d\n", *p);
7 : return 0;
8 : }
<결과화면>
반응형
'Backend > C' 카테고리의 다른 글
fscanf사용하여 형식화된 데이터 읽기 (0) | 2012.04.12 |
---|---|
링크드 리스트 다루기 (0) | 2012.04.12 |
함수 인수로 사용되는 포인터 (0) | 2012.04.12 |
포인터(pointer)란 무엇인가? (0) | 2012.04.12 |
Call by value & call by reference (0) | 2012.04.12 |