CS 기초/메모리 8

[CS50] 파일 읽기

어느덧 벌써 메모리 파트의 마지막인 파일 읽기입니다. 우리가 일상적으로 사용하는 파일은 텍스트, 이미지, 비디오 등 여러 가지 형식이 존재합니다. 각 파일에는 파일 형식을 알려주는 실마리들이 존재한다고 합니다. 만약 파일 형식이 JPEG의 경우 JPEG 파일 형식인지를 알려주는 실마리가 파일 값 속에 있습니다. 이번 포스팅에서는 그 실마리를 찾아보도록 하겠습니다. 우선 다음과 같이 파일을 읽어서 JPEG이미지인지 검사하는 프로그램을 만들어보겠습니다. #include int main(int argc, char *argv[]) { if (argc != 2) { return 1; } FILE *file = fopen(argv[1], "r"); if (file == NULL) { return 1; } unsig..

CS 기초/메모리 2021.08.26

[CS50] 파일 쓰기

지금까지는 get_string, get_int등 사용자에게 입력받는 함수를 cs50 라이브러리를 이용해서 사용했습니다. 그렇다면 라이브러리엔 이 함수가 어떻게 구현되어있을까요? 오늘은 이전 포스팅에서 배웠던 메모리 교환, 스택의 정의를 잘 생각해보고 이 함수를 구현해보고 파일에 출력하는 방법에 대해 공부해보도록 하겠습니다. 지난 포스팅에서 machine code, globals등 메모리 구조에 대해 간단하게 정리했었는데요 이런 그림으로 설명했었습니다. 그 중 heap영역에서는 malloc에 의해 메모리가 더 할당될수록 점점 사용하는 메모리의 범위가 더 아래로 늘어납니다. 마찬가지로 stack 영역에서는 함수가 많이 호출될수록 메모리의 범위가 더 위로 늘어나겠죠 이렇게 서로 점점 늘어나다 보면 제한된 메모..

CS 기초/메모리 2021.08.25

[CS50] 메모리 교환, 스택, 힙

오늘은 메모리에 이미 저장된 값을 교환할 때 어떤 방식으로 교환해야 하는지에 대해 공부해보도록 하겠습니다. 가장 먼저 swap이라는 함수를 따로 만들어서 입력받은 정수 a, b를 교환하는 작업을 해보도록 하겠습니다. #include void swap(int a, int b); int main(void) { int x = 1; int y = 2; printf("x 는 %i, y 는 %i\n", x, y); swap(x, y); printf("x 는 %i, y 는 %i\n", x, y); } void swap(int a, int b) { int tmp = a; a = b; b = tmp; } 위의 코드처럼 x, y에 각각 정수를 입력하고 swap 함수를 사용해 바꿔봤습니다. 결과가 어떻게 나올까요?? 분명히..

CS 기초/메모리 2021.08.24

[CS50] 문자열 복사

지난 포스팅에서 문자열이 메모리에 어떤 방식으로 저장되어있는지, 또 어떻게 불러오고 비교하는지에 대해 공부해봤습니다. 그렇다면 문자열을 다른 곳에 복사할 때는 어떤 방법을 써야 하는지 공부해보도록 하겠습니다. 아래와 같이 문자열이 어떻게 복사가 되는지 보기위해 아래와 같이 문자열을 복사해서 첫 문자를 대문자로 바꾸는 코드를 작성해 보겠습니다. #include #include #include int main(void) { string s = get_string("s: "); string t = s; t[0] = toupper(t[0]); printf("s: %s\n", s); printf("t: %s\n", t); } 처음 입력은 emma로 전부 소문자로 입력한뒤 결과를 봤는데 t뿐 아니라 s까지도 대문자..

CS 기초/메모리 2021.08.22

[CS50] 문자열 비교

오늘은 문자열이 두 개일 때 같은 내용을 담고 있는지?, 또 이 두 개가 직접적으로 비교가 가능한지에 대해 공부해보도록 하겠습니다. 지난 포스팅에서 문자열은 각 문자의 배열이고 각 문자는 메모리에 서로 다른 주소 값을 가지고 있다는 것을 공부했습니다. 실제로 확인해보면 #include int main(void) { char *s = "EMMA"; printf("%p\n", &s[0]); printf("%p\n", &s[1]); printf("%p\n", &s[2]); printf("%p\n", &s[3]); } 이렇게 코드를 작성하고 실행했을 때 주소값이 다르게 출력되는 것을 확인할 수 있습니다. ** 여기서 주소값을 보면 첫 번째 문자인 "E"를 시작으로 메모리상에 바로 옆에 저장되어있는 것을 볼 수 ..

CS 기초/메모리 2021.08.21

[CS50] 문자열

지금까지 문자열을 string이라는 자료형을 사용해 저장해왔습니다. 그런데 C에는 string이 실제로 존재하지 않는 자료형이라고 합니다. 그렇다면 문자열이 실제로 메모리상에 어떻게 저장되어있는지, 저장되어있는 문자열에 어떻게 접근해야 하는지 공부해보도록 하겠습니다. 지금까지 배우면서 문자열을 변수에 저장하기 위해 CS50 라이브러리에 있는 string 자료형을 사용해왔습니다. 예전부터 문자열은 문자의 배열이라고 배웠는데 만약 string s = "EMMA"; 라는 코드가 있다면 그림과 같이 s[0], s[1], ... 처럼 하나의 문자가 배열의 한 부분을 차지하고 마지막엔 \0인 null 종단 문자로 문자열의 끝을 나타내 줬습니다. 그렇다면 문자열의 주소는 어떻게 가리키게 될까요?? 위의 변수 s는 이..

CS 기초/메모리 2021.08.20

[CS50] 포인터

지난 포스팅에서 메모리 주소를 설명하면서 '&'연산자와 '*'연산자를 사용할 때 포인터라는 개념이 나왔는데 오늘은 이 포인터에 대해 공부해보도록 하겠습니다. 다시 한번 설명하자면 '*'연산자는 어떤 메모리 주소에 있는 실제값을 받아오게 해주는 기능을 합니다. 이 연산자를 이용해서 아래와 같이 포인터 역할을 하는 변수 선언도 가능합니다. #include int main(void) { int n = 50; int *p = &n; printf("%p\n", p); printf("%i\n", *p); } 결과는 어떻게 나올까요? 위 코드를 보면 int형 변수 n에는 50이라는 값이 저장되어있습니다. 그리고 *p라는 포인터 변수에 &n이라는 변수 n의 주소를 저장합니다. 그래서 int *p는 *이 이 변수가 포인..

CS 기초/메모리 2021.08.19

[CS50] 메모리 주소

오늘부터는 메모리와 관련해서 공부해보도록 하겠습니다. 오늘은 예전에 문자열과 배열에서 잠깐 다룬 적 있었는데 참조하실분들은 참고해주세요~ https://darmk.tistory.com/entry/CS50-%EB%AC%B8%EC%9E%90%EC%97%B4%EA%B3%BC-%EB%B0%B0%EC%97%B4?category=966397 [CS50] 문자열과 배열 C뿐 아니라 많은 프로그래밍 언어들은 문자열을 저장하기 위해 string 자료형을 사용했습니다. 문자열이라는 단어는 문자가 나열되어있다. 즉 배열되어있다.라는 의미로 추측해볼 수 있는데요. darmk.tistory.com 실제로 코딩할때 작성하는 변수들은 컴퓨터 메모리에 어떤 방식으로 저장되는지 그리고 그 저장된 변수의 메모리 주소를 나타내는 방법과 ..

CS 기초/메모리 2021.08.18