..

정글 - C언어 강의

이동석 코치님 강의

 

  1. C 언어의 특징과 주의점
  • 단순하고 강력하지만, 잘못 다루면 위험한 도구
  • 숙련자에겐 최고의 무기, 초보자에겐 함정이 가득한 전장
  • 핵심 메시지
    • 장점: 높은 성능, 하드웨어 제어, 자유로운 표현
    • 단점: 안전장치 부족, 실수 시 치명적 버그, 이식성 문제
    • 비유: 잘 벼린 칼처럼 유용하지만, 부주의하면 스스로 베일 수 있음
  1. C 언어 변수 타입의 크기와 플랫폼 의존성
  • C 언어는 int, long, short 등의 기본 타입 크기를 표준에서 고정하지 않음
  • 대신 최소 비트 수와 타입 간의 상대적 크기 관계만 보장합니다
    sizeof(short) <= sizeof(int) <= sizeof(long)
  • 이렇게 한 이유는 하드웨어 플랫폼마다 워드 크기(Word Size)가 다르고, 이를 그대로 반영해 이식성을 높이기 위해서
  • 예시
    • 16비트 마이크로컨트롤러: int -> 2바이트
    • 32비트/64비트 PC: int -> 4바이트
  • 반면 파이썬은 하드웨어에 직접 포팅할 것을 전제로 하지 않기 때문에
    • int의 크기를 고정하지 않고 임의 정밀도로 설계
    • 메모리가 허용하는 한 매우 큰 정수를 다룰 수 있음
    • 따라서 플랫폼 간에 동일한 수 표현 가능
  1. CCTV 등 다양한 컴퓨터에 유동적으로 적용 가능

  2. 일을 시키는 단위 스테이먼트, 숫자로 나타낼 수 있으면 익스프레션

  • 실수: if (x = y) - > if (y 값)
  • (i < n && a[i]) -> (i < n & a[i])
  • int y = x/_p; // 주석 이미 시작됨 _/ -> 명확하게 괄호 습관이 좋음
  • printf(‘\n’); // 문자 리터럴을 포인터로 전달
  • 연산자 우선순위 (unsigned r = h«4 + l)
  • 세미콜론 실수 if (x > big); <- null statement 실행함
  • switch의 break 없을 시 case 연속 실행
  • 들여쓰기와 상관없음
  • 평가 순서 불명확, y[i] = x[i++]; -> y[i] = x[i];
  • 포인터와 배열
char *r;  // 틀린 부분 -> char *r = malloc(strlen(s) + strlen(t) + 1);
strcpy(r, s);
strcat(r, t);
  • NULL 포인터
char *p = NULL;
printf("%s\n", p); // UB
  • 매크로와 부작용
#define max(a,b) ((a) > (b) ? (a) : (b))
int a = 1, b = 2, m;
m = max(a++, b); // 함수를 쓸 것
  • C 포인터
    • 기본적인 포인터와 Dereferencing
    • 포인터는 다른 변수나 메모리 주소를 저장하는 변수
      • 포인터는 자료형을 변환해서 연산할 수 있는 장점이 있음
    • 가상 메모리 때문에 1바이트씩 값을 가져와서 해킹같이 할 수가 없음