visual c++오류가 났습니다. 이게 무슨 오류인가요?
글쓴이: lmo98 / 작성시간: 일, 2005/07/17 - 5:44오후
집에서도 visual c++로 짜서 잘 돌아 갔는데요. 똑같은 문제가 정보처리기사 시험에서도 나왔어요. 그래서 똑같이 풀었는데 처음 보는 오류가 떠서 너무 당황했어요. 그 오류는 < debug pdheap =xxxxx, visual c++도움말을 참조하시오 [확인][취소][무시] > 이렇습니다. 화면에 프린트를 하면 값이 제대로 나오는데 이상하게 화일로 결과 값이 저장이 않되는 겁니다. 그래서 free로 할당된 메모리를 지우는 코드를 지우니까 이 오류가 사라졌습니다. 데이터 몇 개 대입해서 맞는 것 같아 제출하고 나왔는데 아직도 미심쩍 습니다.
집에서는 이 소스로 돌아갔는데 시험장에서는 왜 않 돌아 갔을 까요? 이 소스의 free가 잘못 되었나요?
File attachments:
첨부 | 파일 크기 |
---|---|
![]() | 3.3 KB |
![]() | 30.27 KB |
Forums:
txt 올려주셨으면 합니다. 그리고 command line 에서 어떤 명
txt 올려주셨으면 합니다. 그리고 command line 에서 어떤 명령어를 쳤는지도 알려주셔야 합니다. 여기선 인자를 2개 받는데 그것에 대한걸 알려주어야 똑같이 해서 어디에서 에러가 나는지 알아낼수 있습니다.
추측하건데, 아마도 in 이나 out 구조체가 malloc 으로 할당되지 못한경우 segment fault 가 납니다. 왜냐하면 free 할때 chunk struct 가 있는데 거기에는 할당된 메모리 크기,주소가 들어 있습니다. 만약 할당하지 않는 메모리를 해제하면 메모리 크기,주소도 이상한 값을 참조합니다. 여기선 in 과 out 이 stack 에 저장되기 때문에 초기화때 특히 쓰레기 값으로 체워집니다.
주여기선 1000으로 크기가 고정되어 있군요. 보통은 linked list를 써 가변구조로 합니다. infile outfile 같은건 되도록 하드코딩 하지 마세요 마지막으로 변수이름은 되도록이면 로직과 상관있게 , 주석은 자세히 하면 좋겠습니다.
예 관심 가져주셔서 감사합니다
위에 올린 것은 사실 다른 문제입니다. 집에서는 위에 것은 문제가 없었는데요. 자료가 약간 바뀐 시험장에서 작성한 소스는 없습니다 ㅠ.ㅠ;; 위의 프로그램은 mytest 100 200 이렇게 인자를 줬습니다. 그런데 신기한 것은 시험장에서 할당한 것을 free했을 때 인자를 아주 작게 주니까 그 디버그 오류가 안 나는 것이었습니다. 그리고 free하는 코드를 지우니까 오류가 사라 졌습니다.
세그먼트 폴트라는 메세지는 않 나왔고요.... heap어쩌구... visualc++ 도움말 .... 이렇게 창이 뜨더라구요 ..... 이 메세지가 free 함수랑 무슨 상관인지 아직도 모르겠어서 이렇게 질문을 올립니다. 그 오류 메세지를 정확히 적었으면 좋았을껄.....
제가 확신이 안 서는 것은 ..... struct input *in[1000]; 이렇게 주고선 반복문에서 in[i]= (struct input *) malloc (sizeof(struct input)); 이렇게 할당한 후 결과를 구한 후에는 반복문으로 free(in[i]) 를 해 주었는데 이 문법이 틀렸나 해서요..... free를 지운 후에 된다는 것은 분명 free가 잘못됐던 거 같은데 .... 정말 헷갈리네요
free 는 heap 하고 관련 있습니다.메모리 구조는 text |
free 는 heap 하고 관련 있습니다.
메모리 구조는 text | data + heap | stack 구조로 되어있습니다.
text에는 프로그램 기계어가 들어 있습니다.
data를 더 자세히 예기하자면 initialized read only data + initialized read write data + uninitialized data 입니다.
printf("Hellow World"); 에서 Hello World가 initialized read only data
전역변수중 초기화 되면 initialized read write data 안되면
uninitialized data 에 위치하게 됩니다.
heap 은 malloc 호출시 할당되는 메모리 영역입니다.
마지막 stack 에는 함수 인자 , sp , 지역변수 등등이 위치합니다.
위소스에서 *in[1000]은 지역변수이므로 스텍에 4000바이트를 할당합니다. *in[0] 는 4바이트 주소입니다. in[0] = (str... *)malloc .. 할경우 in[0] 메모리 할당된 주소가 넣어지고 실제할당은 heap에 합니다. heap에는 메모리주소 + 크기 + 데이타 가 저장되어 있으며 free시 이값을 참조하여 메모리를 해제합니다.
올리신 코드에는 정렬에서의 사소한 실수를 제외하면 힙이 깨질 만한 문제는
올리신 코드에는 정렬에서의 사소한 실수를 제외하면 힙이 깨질 만한 문제는 없어 보입니다.
그런데 코드가 너무 번잡해서 실수하기 쉽겠더군요. 시험장에서도 뭔가 실수를 하셨을 것
같습니다. sscanf()와 qsort()를 쓰면 코드가 훨씬 간단해지겠네요.
그리고 feof()는 쓸 일이 거의 없습니다. fgets()의 반환값을 이용하세요.
댓글 달기