5. 메모리

예비 개발자·2021년 5월 10일
0

cs50

목록 보기
1/1

一,메모리 주소
- 컴퓨터에게 메모리는 0과 1, 컴퓨터는 2진수만 이해할 수 있음. 사람에게 2진수보다 16진수가 가독성이 좋아 메모리 주소는 16진수로 표현됨.
- 16진수 (hexadecimal) : 0~9,a,b,c,d,e,f
- 2^4 = 16이기 때문에 4bits씩 두 덩어리로 나누면 2진수를 16진수로 변환하기 쉬움. 컴퓨터는 1byte(8bits)단위로 정보 표현해, 2개의 16진수 = 1byte의 2진수.

- 10진수와 구별하기 위해 숫자 앞에 0x를 붙임 .
二,포인터와 문자열
1. 포인터
- 포인터는 추상화를 위해 사용.
- 32bits 포인터는 int타입과 같은 크기, 64bits 포인터는 long타입과 같은 크기.
2. 문자열
- 문자열은 문자의 배열로 'char var' 혹은 'char var[]'로 표현됨.
-
var은 var 문자열의 첫번째 값의 주소 값을 통해 첫번째 값을 가리킴. 마찬가지로 var[0]도 var의 첫번째 값의 주소를 통해 첫번째 값을 가리킴. 문자열의 각 원소들은 메모리상에 연속으로 저장되어있기 때문에 (var+1)은 var[1]의 값과 같음. (더 정확하게는 컴퓨터가 'var[2]'에서 []연산자를 (var+2)로 바꿔서 연산함)
- 다른 type들은 정해진 byte만큼 메모리를 할당하는 반면 문자열은 정해진 byte가 없음. 때문에 문자열의 끝은 '\0'를 넣어 컴퓨터가 여기까지가 문자열이라는 것을 알수 있게 해줌. 문자열의 개수에는 '\0'도 포함함.
- printf, scanf 에서 '%s'형식 지정자를 사용해 입출력 요청을 하면, 그 주소로 가서 첫 글자만 출력하는 게 아니라 다음 문자를 계속 입출력함. (배열은 메모리가 연속적으로 할당된 공간)
三,메모리 할당
1. malloc()
- 메모리 할당 : 메모리 일부분을 가져와서 그곳을 가리키는 포인터를 주는 것.
- int pn1; pn1 = &n1; // n1의 메모리 주소를 구하여 pn1에 할당.
- int
pn2; pn2 = malloc(sizeof(int)); // malloc함수를 통해 int의 크기만큼 동적 메모리 할당.
- 메모리를 따로 할당해주는 이유 : 문자열을 복사할때 포인터의 주소값을 공유하기 때문에, 메모리 할당을 하지않고 복사한다면 복사한 문자열을 변경하거나 삭제할 경우 원본도 똑같이 수정됨.
- 쓰레기 값 : 초기화 하지않은 변수의 값.
2. free()
- malloc함수를 과다 호출할 경우 메모리를 많이 할당해 컴퓨터가 점점 느려지고 메모리가 부족해짐. 따라서 메모리는 해제하는 것이 좋음.
- 메모리 누수 : 할당한 메모리를 해제하지 않을 경우 발생.
- 버퍼 오버플로우: 주어진 배열의 공간을 넘어 접근할 경우 발생. 버퍼는 배열.
3. 메모리 영역

- machine code : 컴파일한 0, 1의 값.
- globals : 전역변수, 정보들의 공간.
- heap : 메모리 할당을 받을 수 있는 커다란 영역, malloc을 호출시 여기서 가져옴.
- stack : 함수의 지역변수가 쌓이는 공간.
- 메모리 영역을 다양하게 나누는 이유 : 유사한 성향의 데이터끼리 묶어 저장하면 관리가 용이하고, 접근속도가 향상돼 메모리를 효율적으로 사용가능.
- NULL : 가리키는 곳이 없는 포인터, 메모리 공간이 할당되지 않았다는 뜻.
四,파일 읽기, 쓰기

- fopen은 해당파일은 가리키는 포인터를 반환. 첫번째 인자는 파일의 이름, 두번쨰 인자는 모드(r, w, a).
- csv : 쉼표로 구분된 값.
- fprintf : 사용자에게 문자열을 입력받고, printf에서처럼 파일에 직접 내용을 출력할 수 있음.
-직업이 끝난 후 fclose함수로 작업 종료.
- fopen, malloc과 같은 함수는 에러가 생기면 NULL값을 반환.
- 파일 시그니쳐 : 팡리들은 각각 고유한 포맷을 가짐. 포맷의 기본이 되는 내용. 각 파일을 구분하기 위해 '파일 시그니쳐'사용.

profile
기록 == 데이터

0개의 댓글