-
NAVER 부스트코스 CS50 - 5. 메모리공부일기/CS50 2020. 8. 17. 17:27
5 메모리
5-1 메모리 주소
컴퓨터 과학에서는 숫자를 10진수나 2진수 대신 16진수로 표현하는 경우가 많다. 데이터를
처리 할 때 장점이 있기 때문인데, 0 1 2 3 4 5 6 7 8 9 a b c d e f 의 순서로 표현한다.
16진수를 표현 할 땐 모든 수 앞에 0x를 붙인다. C에서는 변수의 메모리상 주소를 받기 위해 ‘&’
연산자를 사용할 수 있다. 반대로 ‘*’를 사용하면 그 메모리 주소에 있는 실제 값을 얻을 수 있다.
5-2 포인터
* 연산자는 메모리 주소에 있는 값을 받아올 수 있게 하는데 이를 이용해 포인터 역할을 하는
변수를 선언할 수 있다.
여기서 *p는 포인터 변수이다. 이 포인터 변수에 n의 주소를 받게 되고 int는 포인터가 가리키는
값이 int라는 뜻이다.
5-3 문자열
문자열의 마지막 부분은 \0 인데, 문자열의 끝을 표시하는 약속이다.
위의 함수에서 *s는 포인터 변수, char *는 포인터가 가리키는 값이 char 자료형 이라는 뜻.
printf 함수가 \0 앞 까 지의 값을 읽으며 문자열을 알 수 있다.
5-4 문자열 비교
문자열을 비교할 때 문자열이 저장된 변수를 바로 비교하게 되면 해당 변수가 저장 돼 있는
주소가 다르기 때문에 다르다는 결과가 나온다. 정확한 비교를 하기 위해서는 실제 문자열이
저장돼 있는 곳으로 이동해 각 문자를 하나씩 비교해야 한다.
코드로 나타내보면 이렇게 된다.
5-5 문자열 복사
malloc() : 메모리 할당 함수, 인자로 받는 것은 할당 받을 메모리 크기. 문자열의 길이 +1 만큼
메모리를 할당하고 루프를 돌면서 문자를 복사해야 한다.
5-6 메모리의 할당과 해제
free()는 malloc()으로 할당받은 메모리를 해제해 준다. 메모리 관리를 위해서 필수적으로 해야
한다.
valgrind : 버그를 찾는 도구
버퍼오버플로우: 메모리나 메모리 배열을 다룰 때, 그 공간을 넘어 접근하는 경우
5-7 메모리 교환, 스택, 힙
메모리 안에는 데이터 저장되는 구역이 나눠져 있다. 머신 코드 영역에는 프로그램이 실행될 때
그 프로그램이 컴파일 된 바이너리가 저장된다. 글로벌 영역은 프로그램 안에서 저장된
전역변수가 저장된다. 힙 영역에는 malloc으로 할당 된 메모리의 데이터가 저장되며 밑으로
쌓이게 된다. 그리고 스택에는 프로그램 내의 함수와 관련된 것들이 저장된다.
5-8 파일 쓰기
5-9 파일 읽기
// 전화번호부 파일을 만드는 방법과 읽으려는 파일이 jpeg형식인지 아닌지를 판별할 수 있는 프로그램들을 만들었다. 이번 메모리 부분은 포인터개념이 좀 어려웠고, 퀴즈나 미션들은 해내긴 했지만 꽤나 많은 생각을 요구했다. 메모리가 어떤 구조로 데이터가 저장되고, 사용되는지에 대해 이해하는 데서 만족하려 한다.
'공부일기 > CS50' 카테고리의 다른 글
NAVER 부스트코스 CS50 - 6. 자료구조 (0) 2020.08.19 NAVER 부스트코스 CS50 - 4. 알고리즘 (0) 2020.08.12 NAVER 부스트코스 CS50 - 3. 배열 (0) 2020.08.10 NAVER 부스트코스 CS50 - 2. C언어 (0) 2020.08.05 NAVER 부스트코스 CS50 - 1. 컴퓨팅 사고 (0) 2020.08.03