동적 메모리 할당에서 실행중에 계속 에러가 뜨네요..

shs0917의 이미지

#include <stdio.h> 
#include <stdlib.h> 

#define IS_FULL(temp) (!(temp)) 

typedef struct poly_node *poly_pointer; 
struct poly_node{ 
	int coef; 
	int exp; 
	poly_pointer link; 
}; 

void attach(int coef, int exp, poly_pointer *ptr);

void main(void){ 
	poly_pointer a = NULL, b = NULL, c = NULL; 
    int coef, exp; 
    printf("Input poly1(if coef is '0' then end): "); 
    while(1){ 
       printf("coef: ");      scanf("%d", &coef); 
	   if(coef == 0)
		   break;
       printf("exp: ");      scanf("%d", &exp); 
	   if(exp == 0)
		   break;
	   attach(coef, exp, &a); 
    } 

    printf("Input poly2(if coef is '0' then end): "); 
    while(1){ 
       printf("coef: ");      scanf("%d", &coef); 
	   if(coef == 0)
		   break;
       printf("exp: ");      scanf("%d", &exp); 
	   if(exp == 0)
		   break;
	   attach(coef, exp, &b); 
    } 
    
    printf("\n"); 

    exit(0); 
} 

void attach(int coef, int exp, poly_pointer *ptr){ 
    poly_pointer temp; 
    temp = (poly_pointer)malloc(sizeof(struct poly_node)); 
    if(IS_FULL(temp)){ 
       fprintf(stderr, "Memory is full!\n"); 
       exit(1); 
    } 
    temp->coef = coef; 
    temp->exp = exp; 
    (*ptr)->link = temp; 
    (*ptr) = temp; 
	
	free(temp);
} 

요즘들어 비슷한 질문을 계속 반복해서 올리게 되는거 같아서 죄송스럽네요..
에구.. 제가 링크드리스트가 제대로 이해가 안되는건지..
코드를 아무리 들여다 봐도 무엇이 잘못된건지 잘 모르겠습니다.
답변 부탁 드립니다. :oops:
ifyou의 이미지

main()에서 attach()를 부를때 넘겨주는 poly_pointer가 null 입니다.

    temp->coef = coef; 
    temp->exp = exp; 
    (*ptr)->link = temp; 
    (*ptr) = temp; 

아래에서 null인 ptr을 참조하려 했기 때문에 문제가 생깁니다.
처음 시작하는 head를 만들어줘야 할 것 같고요..

attach()함수에서 free()부분도 나중에 문제가 될 것 입니다.
새로운 놈을 추가해 줬는데, 그 놈을 free()해 버렸으니까요.

또, poly_pointer가 pointer 형 데이터타입이기 때문에 별도로
주소연산자나 포인터 연산자를 사용할 필요가 없을것 같습니다.

그러니까, attach()의 원형도 attach(int,int,poly_pointer)이면 될것 같고,

(*ptr)->link 라는 부분도 ptr->link로 하면 될 것입니다.

혹시, 이석호씨가 번역한 "C로 쓴 자료구조론"라는 유명한 책을 보고
계신것 아닌가요? 변수명이 눈에 익군요

shs0917의 이미지

아.. 단번에 책을 맞춰버리시네요.. 유명한 책이 맞긴 맞나보네요..
제가 자료구조를 제대로 공부해보려고 책을 찾다가 이 책을 보고
정말 필독서로 한권쯤 필요할거 같아서.. 돈주고 사서 공부중입니다.
(신조가 책을 돈주고 사야 아까워서라도 열심히 본다는... :oops: )
답변 감사드리구요.. 빨리 테스트 해봐야 겠습니다..

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

ifyou의 이미지

이런.. attach()함수의 타입은 좀 생각을 해 봐야하겠습니다.

포인터 속에 묻혀 살다보니까 헷갈립니다. T.T

누가 좀 정리해 주세요

차리서의 이미지

shs0917 wrote:
요즘들어 비슷한 질문을 계속 반복해서 올리게 되는거 같아서 죄송스럽네요..

요즘들어 매우 열심히 하고 계시다는 것을 느낄 뿐입니다.
올려주시는 질문을 읽으면서 누군가가 (특히 저처럼 질문을 열심히 읽어도 답변을 달만한 공력이 못되는 사람이) 덩달아 공부하고 있다는 사실은 눈치채셨는지요? :)

--
자본주의, 자유민주주의 사회에서는 결국 자유마저 돈으로 사야하나보다.
사줄테니 제발 팔기나 해다오. 아직 내가 "사겠다"고 말하는 동안에 말이다!

shs0917의 이미지

차리서님은 제가 kldp 돌아댕기면서 게시판에서 꽤 낯익으신 분
같네요.. :D 저도 빨리 내공을 쌓아서 질문보다는 성실한 답변을
많이 달아줄 수 있는 그런 사람이 되고 싶군요.. :oops:

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

shs0917의 이미지

ptr = temp
이런식으로 *형이 아니게 매개변수를 사용해봤었는데.. 그때 올린
질문에 다른분이 달아주신 답변을 인용합니다..

Quote:

여기서 ptr은 함수 호출시 스택에 들어 있는 변수일 뿐입니다.
즉, 리턴되면서 사라져서 의미가 없습니다.

void attach(int coef, int exp, poly_pointer* ptr);
함수를 이렇게 만드시고 포인터를 넘겨서
*ptr = temp;로 바꾸세요.

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.