그라운드 임베디드 유튜브 구독

노트 / C 언어

배열과 문자열: 버퍼 넘침의 원리

배열은 메모리에 연속으로 놓인 같은 자료형의 묶음이고, 문자열은 널 문자로 끝나는 char 배열입니다.

GROUND EMBEDDED · 정리 노트C 언어 05배열과 문자열 1char msg[16]; 2snprintf(msg, sizeof msg, "T=%d", temp);// 크기…

배열

uint8_t buf[8];은 8바이트가 연속으로 놓인 공간입니다. buf[i]는 "시작 주소에서 i칸 뒤"라는 뜻일 뿐이라 C는 범위를 검사하지 않습니다. buf[8]에 쓰면 배열 바로 뒤에 있던 다른 변수가 망가집니다. 이것이 버퍼 넘침입니다.

문자열

C의 문자열은 끝에 '\0'이 붙은 char 배열입니다. "OK"는 세 바이트를 차지합니다.

char msg[16];
snprintf(msg, sizeof msg, "T=%d", temp);   // 크기를 넘기지 않음

strcpy, sprintf처럼 길이를 확인하지 않는 함수 대신 strncpy, snprintf를 씁니다.

임베디드에서 배열이 쓰이는 곳

  • UART 수신 버퍼, 통신 패킷
  • ADC 샘플을 모아 평균 내는 버퍼
  • 룩업 테이블과 설정값 표

배열 크기는 매크로 하나로 정하고 루프 조건도 그 매크로를 쓰면, 크기를 바꿀 때 실수가 줄어듭니다.