본문 바로가기
프로그래밍/한화비전 VEDA

한화비전 VEDA 2기 : 1주차(C) 정리

by 싸이 덕 2025. 3. 22.
반응형
  • 프로그램 카운터 : 명령어를 한 줄씩 실행해서 메모리에 적재
  • 스택 포인터 : 현재 가리키고 있는 스택 메모리 주소
  • 스택 프레임 : 현재 유효한 스택 메모리 공간

  • 메모리 주요 섹션 : cmd의 "objdump -h 실행파일명" 명령으로 상세정보 확인 가능
    • .text : 함수가 모여있음, main 등 (ROM에서 담당)
    • .data : 변수 (RAM)
    • .rdata : 문자열같이 변하지 않는 값 (ROM)
    • .bss : 할당되지 않은 변수, 초기값 0 (RAM)
  • 임베디드칩 일반적 구성
    • ARM : CPU 
    • NORF : NOR Flash, ROM의 일종, build time에 담김
    • SRAM : 스택과 힙 메모리를 여기에 저장, 실제 실행 시간(rum time)에 담김
  • 타입
    • Simple Type
      • char : 1바이트
      • short : 2바이트
      • int : 일반적 4바이트, 사이즈는 워드 수(레지스터가 한 번에 쓸 수 있는 사이즈) 따라감, Atmega 시리즈에선 2바이트
      • long : 8바이트
      • float : 4바이트 (소수점 뒤 7번째까지 유효 숫자, 유효 숫자 : 사이즈 * 2 - 1)
      • double : 8바이트
      • 등..
    • Aggregation Type
      • array
      • struct
      • union
      • 등..
    • 번외 <stdtype.h> 타입 : int8_t, int16_t 등
  • 문자열(char[]) : 문자와 달리 주소값을 저장함 
    • 핵심 함수
      • strcpy
      • strcat
      • strlen
      • strcmp
  • 연산자 우선순위 : 1차 연산((), [], ., ->) > 단항 연산 > 산술 연산 > 관계 연산 > 논리 연산
  • 변수의 속성
    • scope : 값을 인식 가능한 범위 ex) 전역, 지역, 함수, ...
    • lifetime : 메모리에 해당 값을 보유하고 있는 기간 ex) 스택, 레지스터, other .c file, ...
  • 스토리지 클래스
    • static : 파일이 실행되고 끝날때 라이프타임이 시작하고 끝남, 전역으로 사용하면 파일 스코프,함수 앞에도 사용 가능
    • register : 메모리가 아닌 레지스터에 보관
    • auto (기본값)
  • const : lvalue로 오지 못하게 막음, 무조건 수정이 불가능한 것은 X, * 연산자로 수정 가능, 우측에 있는 값에만 적용됨
  • 포인터
    • & 연산자 : promote 연산자, 차원(= *의 개수)을 1단계 올려줌, lvalue 위치에는 사용 불가
    • * 연산자 :
      • Block head에 있을 때 : 포인터 지정 연산자
      • Block body에 있을 때 : demote 연산자, 차원을 1단계 내림
  • 배열
    • 배열 변수는 const라 직접 대입이 불가능함 
    • [] 연산자 :
      • Block head에 있을 때 : 배열 지정 연산자
      • Block body에 있을 때 : 인덱스 연산자, a[i] == *(a+i)

p, pp, ppp는 1중, 2중, 3중 포인터 / a는 배열일 때 간략도

 

  • distance 연산 (주소 - 주소 연산)
    • 주소 + 주소 연산은 불가능
    • 주소 + 정수(스탭으로 암묵적 변환) 연산 가능
    • 결과값은 스탭 단위
    • 스탭 : 타입의 크기 단위 (ex : 4 == int 타입의 스탭 1)
  • 컴파일 : .c 파일 -> .o 파일
  • 링크 : 여러 .o 파일 -> 실행 파일

컴파일, 링크에 따른 저장공간 도식화

  • 2차원 배열을 함수 인자로 전달하는법 : void func(int (*pp)[x축 크기])
    • 2차원 이상의 배열은 2차원 이상의 포인터로 받을 수 없음
      • *함수는 pp를 2차원 배열이라 생각하지 않기 때문에 int 스텝만큼만 움직여서 예상한것처럼 2차원 배열 스텝만큼 움직이지 않음
      • 배열 타입은 알아서 스텝을 인지함
    • int *pp[크기]도 연산자 우선순위로 인해 배열 타입이므로 대입이 X
    • 함수 인자로 온 배열은 값 대입이 가능함 (= 배열이 아니라 포인터임, c에서 예외적으로 허용해놓음, 좋은 방식은 X)

 

  • 함수 포인터 : 함수를 받아 포인터로 사용
    • int (*p)(); 처럼 선언하고 실제 함수를 p = f 처럼 대입해서 사용
    • 함수 포인터를 매개변수로 갖는 함수도 가능
  • void 포인터 : 형 변환이 필수적
  • malloc(크기-바이트)
    • stdlib.h에 존재
    • 저장 공간을 할당하고 void* 형 반환
  • free(주소) : 해당 주소의 메모리 내용을 반환
  • 힙 메모리 : 개발자가 동적으로 할당, malloc으로 할당 
  • 구조체 struct : 다른 타입의 멤버들을 여러개 보관하는 자료구조
    • 바이트 얼라이먼트 : 가장 큰 멤버의 사이즈에 맞춰서 다른 멤버들에 추가로 패딩을 넣어서 크기를 맞춤
    • 구조체.멤버
    • 구조체->멤버 : 구조체가 1차원 이상일 때
  • typedef 키워드 : type의 alias
    • typedef 기존타입 새타입명

 


 

VEDA 바로가기 : https://www.vedacademy.co.kr/

본 후기는 한화비전 VEDA 2기 학습 기록으로 작성되었습니다.

반응형