프로그래밍시에 세그맨테이션 에러
글쓴이: somedayhow / 작성시간: 수, 2013/01/16 - 11:44오전
컴파일은 아무런 에러 메시지가 나타나지 않고 완료되지만
./로 실행하면 세그맨테이션 오류가 나타납니다
아마 포인터와 관련된 메모리 문제가 아닐까 싶은데
해결방법을 잘 모르겠습니다.
첨부한 스크린샷에 나오는것처럼 data[i].Dendrites->Weight 이부분과
sung->Dendrites->Weight =0;
(sung[i].Dendrites->Weight =0;)
이곳들에서 세그맨테이션 오류가 발생합니다.
구조체를 sungjuk을 선언할때 구조체 Dendrite *Dendrites를 집어넣어줬는데
포인터 사용법이 잘못된것인가요?
무엇이 올바른 사용법일까요?
1 #include <stdio.h> 2 3 struct Dendrite 4 { 5 double Weight ; 6 }; 7 8 struct sungjuk 9 { 10 struct Dendrite * Dendrites; 11 char name; 12 int jumsu; 13 }; 14 void sum( struct sungjuk *); 15 int main() 16 { 17 int i; 18 struct sungjuk *data ; 19 sum (data); 20 for( i=0 ; i<10 ; i++) 21 { 22 printf("data[i].jumsu = %d \n",data[i].jumsu); 23 printf("Weight[i] = %lf \n",data[i].Dendrites->Weight); 24 } 25 26 return 0; 27 } 28 29 void sum(struct sungjuk *sung) 30 { 31 int tot=0,i; 32 for(i =0 ; i<10 ; i++) 33 { 34 //sung->Dendrites->Weight=0; 35 sung[i].jumsu+=10; 36 } 37 } ~ 그리고 컴파일시에 error:세그맨테이션 오류 (dump) (정확한 오류 메시지인지는 모르겠습니다 ㅠㅠ) 이런 식의 메시지가 나타날때도 있는데 도대체 세그맨테이션 오류란것은 무엇인가요?
File attachments:
첨부 | 파일 크기 |
---|---|
영역_016.jpeg | 946.45 KB |
Forums:
포인터에 할당이 안되있네요
sungjuk *data도 그렇고 sungjuk구조체 안에있는 Dendrite 구조체 포인터도 할당이 안되있습니다.
동적할당이 문제였군요
그렇게 피하기만 했던 동적할당도 써야만 할 일이 생기니 조금씩 익숙해지는것 같네요 ㅎㅎ
답변 고마워요~
----------------------------------------------------------------------------------------------------------------------
많이 배워갑니다
고맙습니다.
언젠가 질문이 아니라 답변을 달아줄 수 있는 날이 오기를
윗분 말씀대로
윗분 말씀대로 포인터 선언만 했고 해당 포인터가 가리키는 곳이 Invalid 하네요.
동적할당을 하시던가 아니면 main안의 지역변수를 가리키던가 해야할듯
넵 동적할당을 했습니다.
이제 그 부분은 해결이 되었어요
답변 고맙습니다
----------------------------------------------------------------------------------------------------------------------
많이 배워갑니다
고맙습니다.
언젠가 질문이 아니라 답변을 달아줄 수 있는 날이 오기를
무엇을 의도한 코드일까...
으음....
그냥 연습용입니다
포인터에 대한 개념이 너무 부족해서 직접 만져가면서 공부하는데 개념이 잘 안잡히네요 ㅠㅠ
----------------------------------------------------------------------------------------------------------------------
많이 배워갑니다
고맙습니다.
언젠가 질문이 아니라 답변을 달아줄 수 있는 날이 오기를
음 ..
포인터는 그냥 변수입니다. 변수인데 저장되는 값은 메모리의 주소가 되죠.
즉 포인터에 NULL 이 아닌 값이 들어가 있다면, 그 값(주소)에 가리키는 곳은 반드시 유효한 메모리 공간이라는 게 보장이 되어야 합니다.
그 유효한 메모리 공간은 지역/전역 변수나 동적으로 할당한 공간을 뜻합니다.
프로그램이 유효하지 않은 메모리 공간에 접근할 경우에는 segmentation fault 가 발생합니다.
seg. fault 가 발생하면 프로세스에 SIGSEGV 라는 signal 이 전송되고..
signal 을 받은 프로세스는 현재의 메모리 상태를 core 파일로 남기고 종료합니다.
만약 18, 19 번째 라인 처럼 달랑 포인터 변수만 선언하고, 그 변수의 값을 sum() 에 전달한다면..
sum 은 초기화 되지 않은 포인터 변수, 뭐가 들어있는지도 모르는 메모리의 주소를 전달 받게 된거고..
sum 에서 그 유효하지 않은 메모리에 접근하려고 하다 보니, segmentation fault 가 발생한 겁니다.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
답변 고맙습니다~
지금 동적 메모리를 사용해서 만들고 있습니다 ㅎㅎ
아.. seg. fault가 그런 의미였군요 고맙습니다.
이 참에 좋은 공부를 하는것 같아요
그런데 core파일로 남긴다는건 나중에 분석을 하게 할려고 남겨두는것일건데
그걸로 디버깅을 할 수가 있나요?
배워두면 유용한 방법이 될까요?
----------------------------------------------------------------------------------------------------------------------
많이 배워갑니다
고맙습니다.
언젠가 질문이 아니라 답변을 달아줄 수 있는 날이 오기를
음 ..
core dump 는.. 프로세스가 죽은 이유, 상황을 자세히 알려주는 아주 중요한 증거가 됩니다.
프로세스가 core 라도 생성하고 죽어주면 정말 아주 감사한 거죠.
문제 상황이 아니더라도, 메모리 상태나 콜 스택 같은거 분석이 필요한 경우..
강제로 시그널 발생시켜서 dump 하기도 합니다.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
입력값도 없고, 컴파일도 안될듯한데요!
우선 printf을 10번 돌리는거 보니까 점수와 무게값에 대한 입력 또는 초기값 설정하는 부분이 없네요.
그리고 구조체 사용이 잘못되어 컴파일 안될듯하고요!
sum의 함수에도 문제가 있고요... 해결 방법은 아래 질문에 제시한 내용 참조하시면 될 도옴이 될 듯하네요.
댓글 달기