..

정글 C언어 특강

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

  4. 일을 시키는 단위 스테이먼트, 숫자로 나타낼 수 있으면 익스프레션
    • 실수: 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바이트씩 값을 가져와서 해킹같이 할 수가 없음