visual c++오류가 났습니다. 이게 무슨 오류인가요?

lmo98의 이미지

집에서도 visual c++로 짜서 잘 돌아 갔는데요. 똑같은 문제가 정보처리기사 시험에서도 나왔어요. 그래서 똑같이 풀었는데 처음 보는 오류가 떠서 너무 당황했어요. 그 오류는 < debug pdheap =xxxxx, visual c++도움말을 참조하시오 [확인][취소][무시] > 이렇습니다. 화면에 프린트를 하면 값이 제대로 나오는데 이상하게 화일로 결과 값이 저장이 않되는 겁니다. 그래서 free로 할당된 메모리를 지우는 코드를 지우니까 이 오류가 사라졌습니다. 데이터 몇 개 대입해서 맞는 것 같아 제출하고 나왔는데 아직도 미심쩍 습니다.
집에서는 이 소스로 돌아갔는데 시험장에서는 왜 않 돌아 갔을 까요? 이 소스의 free가 잘못 되었나요?

File attachments: 
첨부파일 크기
파일 mytest.c3.3 KB
Plain text icon abc1118.txt30.27 KB
r3d0ny0u의 이미지

txt 올려주셨으면 합니다. 그리고 command line 에서 어떤 명령어를 쳤는지도 알려주셔야 합니다. 여기선 인자를 2개 받는데 그것에 대한걸 알려주어야 똑같이 해서 어디에서 에러가 나는지 알아낼수 있습니다.

추측하건데, 아마도 in 이나 out 구조체가 malloc 으로 할당되지 못한경우 segment fault 가 납니다. 왜냐하면 free 할때 chunk struct 가 있는데 거기에는 할당된 메모리 크기,주소가 들어 있습니다. 만약 할당하지 않는 메모리를 해제하면 메모리 크기,주소도 이상한 값을 참조합니다. 여기선 in 과 out 이 stack 에 저장되기 때문에 초기화때 특히 쓰레기 값으로 체워집니다.

주여기선 1000으로 크기가 고정되어 있군요. 보통은 linked list를 써 가변구조로 합니다. infile outfile 같은건 되도록 하드코딩 하지 마세요 마지막으로 변수이름은 되도록이면 로직과 상관있게 , 주석은 자세히 하면 좋겠습니다.

lmo98의 이미지

위에 올린 것은 사실 다른 문제입니다. 집에서는 위에 것은 문제가 없었는데요. 자료가 약간 바뀐 시험장에서 작성한 소스는 없습니다 ㅠ.ㅠ;; 위의 프로그램은 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가 잘못됐던 거 같은데 .... 정말 헷갈리네요

r3d0ny0u의 이미지

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시 이값을 참조하여 메모리를 해제합니다.

doldori의 이미지

올리신 코드에는 정렬에서의 사소한 실수를 제외하면 힙이 깨질 만한 문제는 없어 보입니다.
그런데 코드가 너무 번잡해서 실수하기 쉽겠더군요. 시험장에서도 뭔가 실수를 하셨을 것
같습니다. sscanf()와 qsort()를 쓰면 코드가 훨씬 간단해지겠네요.
그리고 feof()는 쓸 일이 거의 없습니다. fgets()의 반환값을 이용하세요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.