[C] Memory

jiyehyeon·2022년 5월 3일
0
  • 메모리
    컴퓨터 메모리는 16진수
    EX. 10=>16, 0A=>10, FF=>255(16x15+15)
    16진수 앞에는 '0x'표시를 붙여 표시한다.
    int는 4byte(32bit)

  • RGB컬러
    FF | 00 | 00 => R(Red)가 255만큼, G랑 B는 0이므로 #FF0000이 빨간색인 것

  • &와 *의 차이점
    &: Get the address(&다음 써있는 변수의 메모리 주소)
    *: Go to that address(*다음 써있는 주소에 들어있는 값)
    *뒤에 주소를 직접 쓰려면 형식 변환을 해야됨

  • 포인터
    int *p => 주소값을 받기 위한 포인터변수 p를 선언, 주소에 들어있는 데이터가 int형이라는 뜻
    이러면 \p 출력시에는 주소값이 출력되고, *p 출력시에는 주소에 있는 정수값이 출력됨.
    주소를 저장하려면 무조건 *을 써야함. 안그럼 컴파일 에러남.
    포인터를 많이 쓰면 아주 정교한 자료형을 만들 수 있음.

  • 동적 메모리:
    프로그램 실행 도중 필요한 만큼 시스템에서 메모리를 할당 받아 쓰고 다쓰면 반납하는 메모리

  • malloc()
    char *t = malloc(strlen(s) + 1);
    free(t);
    동적 메모리 할당할때 쓰임. EX) int *x = malloc(10 * sizeof(int));
    => 이러면 x[0]부터 x[9]까지의 메모리를 쓸 수 있음
    int가 4byte니까 x에 40byte를 할당함. 사실 malloc은 시작주소를 리턴함.
    malloc을 호출할 때 마다 힙영역에서 메모리를 가져다 씀

  • 힙, 스택
    malloc은 힙영역에서 메모리를 사용,
    main함수의 지역변수는 스택영역에,
    전역변수는 힙 위에 쌓임

  • 버퍼 오버플로우
    메모리 공간 혹은 배열을 넘어 접근하는 것

  • 메모리에 신경쓰며 swap함수 구현하는 방법

void main(){
	int x=1;
    int y=2;
    
    swap(&x, &y);
}

void swap(int *a, int *b){
	int tmp=*a;
    *a = *b;
    *b = tmp;
}
  • 포인터 변수를 사용하는 법
    포인터 변수를 int *a와 같이 선언을 했다면
    *a=42와 같은 식으로 바로 값을 넣을 수 없음.
    주소값을 먼저 할당해줘야 함 !!!!
    그래서 malloc함수를 이용해서 메모리를 할당해서 초기화를 해줌.
    *a=malloc(sizeof(int));
    이렇게 하는 것임

참고 강의: https://www.boostcourse.org/cs112/lecture/119027?isDesc=false
https://www.boostcourse.org/cs112/lecture/119036?isDesc=false

malloc, 포인터 개념들이 헷갈렸었는데 위 링크를 통해 명료하게 정리됨!

이제 구조체랑 클래스 차이를 이해해야겠다..

profile
https://github.com/jiyehyeon

0개의 댓글