본문 바로가기
2️⃣ 개발 지식 B+/draft (비공개 모음)

C 언어 퀴즈 (feat. RB트리 복습)

by ddubbu 2024. 9. 7.

 

출처


 

 

  • 다음 세 함수 f1, f2, f3 각각에 대해서 문제가 있는지, 문제가 있다면 어떤 문제가 있는지 설명하시오.
    • f1 : 지역변수 x의 주소를 return함 - 지역변수는 해당 함수가 끝나면 유효하지 않아서 값이 바뀔 수 있음
    • f2 : uninitialized pointer - px의 값이 임의의 값이므로 임의의 주소에 10을 넣으려고 함. Segmentation Fault
    • f3 : memory leak 가능성 있음 - malloc으로 할당된 메모리가 free되지 않음. - f3를 부른 함수에서 free를 해 주지 않으면 memory leak 발생
int* f1(void) {
  int x = 10;
  return (&x);
}

int* f2(void) {
  int *px;
  *px = 10;
  return px;
}

int* f3(void) {
  int *px;
  px = (int *) malloc(sizeof(int));
  *px = 10;
  return px;
}

 

 

  • 다음 프로그램에서 string "abc", "def", "ghi"는 각각 어느 메모리 영역으로 할당되는가?
    • abc - data
    • def - stack
    • ghi - heap

참고: https://stackoverflow.com/questions/1704407

cc -S 로 assembly code로 바꿔 보면 확실히 알 수 있음. 'abc' 만 .rodata에 있고, 'def'는 stack 영역에 복사, 'ghi'는 malloc의 return 값인 %rax의 indirect address로 복사됨.

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

int main() {
  char *s1 = "abc";
  char s2[] = "def";
  char *s3 = (char *) malloc(4);
  strncpy(s3, "ghi", 4);
  printf("%s %s %s\n", s1, s2, s3);
  free(s3);
  return 0;
}

 

 

  • rbtree-lab의 node 정의를 다음과 같이 바꾼다고 가정하면 코드 구현을 개선할 수 있습니다.
    어느 부분을 어떻게 개선할 수 있을까요?
    • 코드가 비슷한 leftRotate(T, x), rightRotate(T, x) 두개의 함수를 하나의 함수 rotate(T, x, dir)로 구현할 수 있다. dir은 0 또는 1로, 같은 쪽 child는 child[dir]로 반대쪽 child는 child[1-dir]로 코딩할 수 있다.

참고: https://en.wikipedia.org/wiki/Red%E2%80%93black_tree#Operations

typedef struct node_t {
  color_t color;
  key_t key;
  struct node_t *parent;
  struct node_t *child[2];
} node_t;