Backend/C

Segmentation Fault

petitCoding 2012. 4. 12. 10:26

다음 소스 코드를 보자. 이 코드에서 과연 에러가 날까?

 

 

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