CS지식

TIL 정리_41

ran4 2022. 3. 28. 19:00

입력값으로 “emma”를 주게 된다면, 단순한 예상과는 다르게 st 모두 “Emma”라고 출력된다

->s라는 변수에는 “emma”라는 문자열이 아닌 그 문자열이 있는 메모리의 주소가 저장되기 때문

 

두  문자열을 실제로 메모리상에서 복사하려면 메모리 할당 함수를 사용해야한다

malloc : 정해진 크기만큼 메모리를 할당하는 함수이다

t[0] = toupper(t[0]);

char *t = malloc(strlen(s) +1);

strcpy(s, t); //copy

 

메모리 할당 및 해제

malloc 함수를 이용하여 메모리를 할당한 후에는 free라는 함수를 이용하여 메모리를 해제해야한다

free(t);

 

변수의 값을 초기화 하지 않으면 쓰레기 값으로 남게되어 메모리 용량의 낭비가 발생한다

-> 메모리 누수라고 한다

버퍼 오버플로우는 x[10] = 0; 코드로 인해 발생한다

 

 

메모리 교환

함수 swap은 정수 ab를 입력받아 그 값을 바꾸는 일을 수행

임시공간 tmp에 복사하여 옮긴다

ab는 각각 xy의 값을 복제하여 가지게 되는데, 

복제된 값이 복사되어 값이 바뀌지 않고 그대로 출력되는 오류가 발생한다

 

해결방법 : 참조로 전달 참조 = 포인터(*)

=> main에서 x,y를 초기화하고 ab를 각각 xy를 가리키는 포인터로 지정함으로써 이 문제를 쉽게 해결할 수 있다

 

머신 코드 영역 : 프로그램이 실행될 때 그 프로그램이 컴파일된 바이너리가 저장된다

글로벌 영역 :  프로그램 안에서 저장된 전역 변수가 저장된다

힙 영역 : 메모리를 저장할 수 있는 거대한 영역 메모리를 사용할수록 아래로 이동한다

malloc으로 할당된 메모리의 데이터가 저장되고 스택에는 프로그램 내의 함수와 관련된 것들이 저장된다

메모리 영역을 다양하게 나누는 이유

-> 메모리를 효율적으로 관리하기 위해서

 

 

오버플로우

힙 영역에서는 malloc 에 의해 메모리가 더 할당될수록, 점점 사용하는 메모리의 범위가 아래로 늘어난다.

마찬가지로 스택 영역에서도 함수가 더 많이 호출 될수록 사용하는 메모리의 범위가 점점 위로 늘어난다.

이렇게 점점 늘어나다 보면 제한된 메모리 용량 하에서는 기존의 값을 침범하는 상황도 발생하는데,

이를 힙 오버플로우 또는 스택 오버플로우라고 한다

버퍼 오버플로우 : 컴퓨터가 너무 많은 메모리를 쓰다보면 파일이나 사진이 안열리거나 동작을 멈추는 것

 

scanf : 사용자로부터 형식 지정자에 해당되는 값을 입력받아 저장하는 함수

scanf(“x: %i\n”, x); &x를 사용하여 주소 전달

get_int 코드에서 &s로 그 주소를 입력해주는 부분을 유의해야한다

-> scanf 함수의 변수가 실제로 스택 영역 안에 s가 저장된 주소로 찾아가서 사용자가 입력한 값을 저장하도록 하기 위함이다

 

char *s : 메모리 영역의 주소를 저장할 수 있는 변수

NULL : 빈 공간. 메모리 공간이 할당되지 않음

 

파일쓰기 : 사용자에게 입력받는 함수의 구현

fopen이라는 함수를 사용하여 FILE이라는 자료형을 호출한다

fopen, malloc, get_string과 같은 함수는 에러가 생기면 NULL을 반환한다

 

파일읽기 : 파일을 읽고 JPEG 파일인지를 검사하는 프로그램을 작성

크기가 3인 문자 배열을 만들고, fread 함수를 이용해서 파일에서 첫 3바이트를 읽어온다.

*fread 함수의 각 인자는 (배열, 읽을 바이트 수, 읽을 횟수, 읽을 파일)을 의미

JPEG파일의 첫 세 바이트는 FF D8 FF로 시작

->마지막으로 읽어들인 각 바이트가 각각 0xFF, 0xD8, 0xFF 인지를 확인

 

 

변수는 사용하기 전에 초기화 해야 한다

배열 : (대괄호를 통해 나타낼 수 있는)메모리 덩어리

포인터 :메모리의 주소

realloc() : 메모리를 새로 할당한다

널인지 체크하고 새로운 값을 저장한다 (이전값 자동처리)

 

임시메모리를 할당하는 이유 : 이전에 할당된 메모리의 크기를 조절할 때, 그 메모리 주변에는 이미 다른 정보로 인하여 메모리가 할당되었을 가능성이 크다.

따라서, 임시로 메모리를 새로 할당해주어야 온전히 옮길 수 있다.

'CS지식' 카테고리의 다른 글

TIL 정리_61  (0) 2022.04.17
TIL 정리_42  (0) 2022.03.29
TIL 정리_40  (0) 2022.03.27
TIL 정리_39  (0) 2022.03.26