메모리 8

[CS50] 연결리스트 : 시연

이번 포스팅에선 저번 포스팅의 내용을 실제 강의에서 어떤 방식으로 학생들이 시연하는지를 보고 이해하는 것이 편할 것 같아 링크를 남깁니다. https://www.boostcourse.org/cs112/lecture/119040?isDesc=false 모두를 위한 컴퓨터 과학 (CS50 2019) 부스트코스 무료 강의 www.boostcourse.org 이 영상을 보고 지난 시간에 코딩했던 코드를 보면 이해가 빠를겁니다. #include #include //지난 시간에 포스팅한 node 구조체 정의 typedef struct node { int number; struct node *next; } node; int main(void) { //list라는 이름의 node 포인터를 정의함과 동시에 NULL로 초..

[CS50] 연결리스트 : 코딩

지난 포스팅에서 연결 리스트의 정의와 리스트의 기본 단위가 되는 구조체를 정의하는 방법에 대해 공부했습니다. 오늘은 이 구조체를 이용해 실제로 연결 리스트를 구현하고 사용해보도록 하겠습니다. 실제로 그림과 같이 리스트에 숫자 2가 저장되어있다고 할때 그림과 같이 숫자 4를 추가하려면 어떻게 해야 할까요? 코드로 작성해보면 node *n = malloc(sizeof(node)); if (n != NULL) { n->number = 4; n->next = NULL; } 이런 식으로 작성해서 4를 넣기 위한 새로운 node를 할당받아야 합니다. 하지만 이렇게 node를 만들기만 한다고 끝나는 것이 아니라 화살표도 연결해줘야 list와 연결된 숫자임을 알 수 있습니다. 어떻게 화살표를 추가해야 할까요? 여기서 ..

[CS50] 연결리스트 : 도입

지금까지 여러 자료형의 데이터를 메모리에 저장하고, 읽고, 삭제하는 방법에 대해 공부했었습니다. 그런데 만약 프로그램이 복잡해지거나 양이 방대해진다면 기본적인 포인터 구조만으로는 메모리를 관리하기에 다소 번거로울 겁니다. 그래서 오늘은 메모리를 더 효율적으로 관리하고 사용하기 위한 데이터의 개념과 연결 리스트에 대해 공부해보도록 하겠습니다. 데이터 구조란 우리가 컴퓨터 메모리를 효율적으로 관리하기 위해 새로 정의하는 구조체입니다. 이 데이터 구조중 하나인 연결 리스트는 배열과 다르게 각 값이 메모리에 여러군데 나누어져 있더라도 다음 값의 메모리 주소만 기억한다면 배열처럼 값을 연이어서 읽어 들일 수 있게 해 주는 것을 말합니다. 이렇게 각각의 번호가 떨어져 있더라도 포인터를 이용해서 자신의 값과함께 바로..

[CS50] 배열의 크기 조정하기

컴퓨터의 메모리는 사물함 같은 구조를 가지고 있습니다. 예를 들어 학교에 30개의 사물함이 있다고 하면 전학생이 왔다고 해서 사물함의 개수를 더 늘리거나 30개보다 더 많이 사용할 수는 없습니다. 이 같이 이미 일정한 크기의 메모리가 할당되어 있는 상황에서 그 크기를 늘리기는 쉽지 않습니다. 오늘은 포인터와 malloc의 개념을 응용하여 이미 정의된 배열의 크기를 바꾸는 방법에 대해 공부해보도록 하겠습니다. 배열의 크기를 늘리기 가장 쉬운방법은 이미 배열이 저장된 메모리의 옆에 일정 크기의 메모리를 덧붙이면 되지만 실제로는 다른 데이터가 있을 수 있기 때문에 어렵습니다. 따라서 새로운 공간에 큰 배열을 저장할 수 있는 메모리를 다시 할당하고 기존 배열의 값을 하나씩 옮겨줘야합니다. 이러한 작업은 기존 배..

[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] 포인터

지난 포스팅에서 메모리 주소를 설명하면서 '&'연산자와 '*'연산자를 사용할 때 포인터라는 개념이 나왔는데 오늘은 이 포인터에 대해 공부해보도록 하겠습니다. 다시 한번 설명하자면 '*'연산자는 어떤 메모리 주소에 있는 실제값을 받아오게 해주는 기능을 합니다. 이 연산자를 이용해서 아래와 같이 포인터 역할을 하는 변수 선언도 가능합니다. #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

[CS50] 하드웨어의 한계

컴퓨터는 프로그램을 구동하기 위해서 다양한 물리적 장치를 이용합니다. 그중 하나가 아래 보이는 메모리 혹은 램이라는 것으로 프로그램이 필요한 정보가 저장되는 곳입니다. 이러한 램의 용량은 유한하기 때문에 때로는 프로그램에서 의도하지 않은 오류가 발생하기도 합니다. 지금까지는 의도적이던 아니던 사용자의 실수로 인해 에러가 발생했는데 램(RAM : Random Access Memory)은 유한한 크기의 비트만 저장할 수 있기 때문에 때로는 컴퓨터에서 부정확한 결과를 나타내기도 합니다. 그렇다면 어떠한 예시가 있는지 알아봅시다. 부동 소수점 부정확성 x / y의 결과를 출력하는 코드를 작성해보겠습니다. #include #include int main(void){ float x = get_float("x : "..

CS 기초/C언어 2021.08.03