KU COSE101 2017기말고사 5번 문제

1 minute read

             
2016 기출 1번 2번 3번 4번 5번  
2017 기출 1번 2번 3번 4번 5번  
2018 기출 1번 2번 3번 4번 5번 6번

다음 C 프로그램에 대하여 물음에 답하시오.

typedef struct node{
  char* name;
}Node, *NodePtr;

NodePtr create(char* message) {
  NodePtr new_element = (NodePtr)malloc(sizeof(Node));
  if(!new_element){
    printf("Out of memory\n");
    return NULL;
  }
  new_element->name = message;
  return new_element;
}

void destroy(NodePtr garbage_element) {
  free(garbage_element->name);
  free(garbage_element);
}

(a) 다음 프로그램은 실행시간 오류(런타임 에러)를 발생시킨다. 오류가 발생하는 line을 지정하고 오류가 발생한 이유를 설명하시오.

1 void main() {
2   char message[] = "Hello, World";
3   NodePtr element = create(message);
4   if (element) { 
5     printf("Element is %s\n", element->name);
6     destroy(element);
7   }
8 }

(b) 다음 프로그램은 오류를 발생시킨다. 오류가 발생하는 line을 지정하고 오류가 발생한 이유를 설명하시오.

 1   void main() {
 2     char message[] = "Hello, world";
 3     char* copy = (char*)malloc(strlen(message) + 1);
 4     strcpy(copy, message); 
 5     NodePtr element1 = create(copy);
 6     NodePtr element2 = create(copy);
 7     if (element1)
 8       destroy(element1);
 9     if (element2)
10       destroy(element2);
11   }

(c) 위의 두 예제에서 오류 상황이 발생하지 않도록 create() 함수를 수정하시오.

NodePtr create(char* message) {

}

정답
(a) Line 6; message는 malloc에 의해 할당된 포인터가 아니기 때문에 free 함수를 사용할 수 없다.
(b) Line 10; copy는 이미 free에 의해 해제 되어있기 때문에 다시 free할 수 없다.
NodePtr create(char* message) {
  NodePtr new_element = (NodePtr)malloc(sizeof(Node));
  char* new_message = (char*)malloc(sizeof(strlen(message)+1);
  
  strcpy(new_message, message);
  
  if(!new_element){
    printf("Out of memory\n");
    return NULL;
  }
  
  new_element->name = new_message;
  return new_element;
}
코드에 에러가 발생하지 않게 하도록 하기 위해서는
create함수로 넘어온 message를 포인터로 메모리를 할당시켜 free를 사용할 수 있게끔 만들면 된다.

Comments