전체 글
-
[자료구조] 연결리스트 : 도입Stage/Computer Science 2021. 6. 1. 23:25
학습 목표 연결 리스트의 정의를 설명할 수 있다. 1. 데이터 구조 기본적인 포인터 구조만 이용해서 메모리를 관리하기에는 다소 번거로울 때가 많다. 데이터 구조는 컴퓨터 메모리를 더 효율적으로 관리하기 위해 새로 정의하는 구조체이다. 쉽게 기억하기 위해, 일종의 메모리 레이아웃 또는 메모리 지도라고 생각하자. 2. 연결 리스트 배열에서는 각 인덱스의 값이 메모리상에서 연이어 저장되어 있다. 하지만 다음 인덱스의 값이 메모리상에서 멀리 떨어져 있다면 안되는 걸까? 각 인덱스 값이 메모리상에 여러 군데 나뉘어져 있다고해도 자기 바로 뒤에 오는 값의 메모리 주소만 기억하고 있다면 그 값을 연이어서 읽어들일 수 있다. 이것을 연결 리스트라고 한다. 크기가 3인 연결 리스트 이다. 이 연결리스트는 각 인덱스가 메..
-
[자료구조] 배열의 크기 조정Stage/Computer Science 2021. 6. 1. 23:23
학습 목표 배열의 크기를 조정하는 코드를 작성할 수 있다. 1. 배열의 크기 조정 배열의 크기를 키우려면 어떻게 해야 할지 생각해보자. 배열의 크기가 3이고, 이 크기를 4로 하고 싶다면 단순히 생각하면 크기가 3인 배열 바로 옆에 한 바이트의 공간만 더 붙이면 된다. 실제로도 이런 방식으로 배열의 크기를 조정할 수 있을까? 실제로는 키우려는 배열 메모리 주위에는 다른 메모리들로 둘러 쌓여있을 확률이 높다. 기존에 사용하고 있던 메모리 뒤에는 다른 데이터들이 담겨 있을 수 있는데 이 상태에서 데이터를 메모리를 새로 할당하지 않고 메모리 크기를 키운다면 뒤에 있던 메모리에 데이터를 덮어쓰는 일이 발생할 수 있다. 따라서 안전하게 새로운 공간에 큰 크기의 메모리를 다시 할당하고 기존 배열의 값들을 하나씩 옮..
-
[자료구조] malloc과 포인터 복습Stage/Computer Science 2021. 6. 1. 23:21
학습 목표 포인터의 개념과 malloc 함수의 용법을 잘 이해할 수 있다. 1. 오류 파악하기 아래 코드를 보고 문제가 될 만한 지점이 어디인지 찾아보자. int main(void) { int *x; int *y; x = malloc(sizeof(int)); *x = 42; *y = 13; } malloc 함수는 할당하고 싶은 크기를 인자로 받는다. 의미를 바로 파악하지 못한 부분: *x = 42 = x의 주소로 가서 42를 저장해라. 문제가 되는 부분은 *y = 13; 이 부분이다. 위 코드에서 x에는 메모리를 할당해줬는데, y에는 아무런 액션을 취한 것이 없다. y는 포인터로는 선언되었는데, 어디를 가리킬지에 대해서는 아직 정의가 되지 않았다. 초기화 되지 않은 *y는 프로그램 어딘가를 임의로 가리키..
-
[메모리] 파일 읽기Stage/Computer Science 2021. 6. 1. 11:33
학습 목표 파일을 읽고 JPEG 파일인지를 검사하는 프로그램을 작성할 수 있다. 1. 파일 읽기 파일의 내용을 읽어서 파일 형식이 JPEG 이미지인지 검사하는 프로그램을 만들어보자. #include int main(int argc, char *argv[]) { if (argc != 2) { return 1; } FILE *file = fopen(argv[1], "r"); if (file == NULL) { return 1; } unsigned char bytes[3]; fread(bytes, 3, 1, file); if (bytes[0] == 0xff && bytes[1] == 0xd8 && bytes[2] == 0xff) { printf("Maybe\n"); } else { printf("No\n");..
-
[메모리] 파일 쓰기Stage/Computer Science 2021. 6. 1. 11:18
학습 목표 사용자로부터 값을 입력받아 파일에 출력하는 프로그램을 작성할 수 있다. 1. 힙 오버플로우, 스택 오버플로우 힙 영역에서 계속 malloc을 호출하게 되면 화살표 방향(아래방향)으로 메모리를 계속 사용하게 된다. 스택 영역에서는 함수가 많이 호출되면 될수록 사용하는 메모리 범위가 점점 위로 늘어나게 된다. 이렇게 힙과 스택 영역에서 계속해서 늘어나다 보면 메모리 용량은 제한되어있기 때문에 두 메모리 영역이 어디선가 충돌하게 된다. 이 같은 현상을 힙 오버플로우 또는 스택 오버플로우라고 말한다. 2. 사용자에게 입력 받기 스택은 get_int, get_string 같은 함수에서도 사용된다. get_int, get_string 함수를 직접 구현해보자. 2.1 get_int #include int ..
-
[메모리] 메모리 교환, 스택, 힙Stage/Computer Science 2021. 6. 1. 00:09
학습 목표 메모리에 저장된 두 값을 교환하는 코드를 작성할 수 있다. 1. 값 교환하기 a와 b의 값을 입력 받고 두 값을 교환하는 코드를 출력해보자. #include void swap(int a, int b); int main(void) { int x = 1; int y = 2; printf("x is %i, y is %i\n", x, y); swap(x, y); printf("x is %i, y is %i\n", x, y); } void swap(int a, int b) { int tmp = a; a = b; b = tmp; } swap 함수를 통해 두 값이 교환 될 것이란 걸 기대할 수 있다. 출력해보면? 나의 예상과는 다르게 x와 y가 바꿔지지 않고 그대로 출력된다. swap 함수가 제대로 작동되..
-
[메모리] 메모리 할당과 해제Stage/Computer Science 2021. 5. 31. 23:51
학습 목표 메모리를 할당하고 해제할 수 있다. 1. 메모리 해제 malloc 함수를 이용하여 정해진 크기만큼 메모리를 할당한 후에는 free라는 함수를 이용해서 메모리를 해제해줘야 한다. 1.1 메모리를 해제하지 않으면? 메모리를 해제하지 않으면 메모리에 저장한 값은 쓰레기 값으로 남게 된다. 이 쓰레기 값들은 메모리 용량을 차지하게 돼서 메모리 낭비가 발생하게 되는데, 이런 현상을 메모리 누수라고 한다. help50 valgrind ./filename valgrind라는 프로그램을 사용하면 지금 내가 작성한 코드에서 메모리 누수가 발생되고 있는지 확인할 수 있다. 2. 메모리 관련 에러 이 코드를 실행시켜 보자. #include void f(void) { int *x = malloc(10 * sizeo..
-
[메모리] 문자열 복사Stage/Computer Science 2021. 5. 31. 23:36
학습 목표 문자열을 복사할 수 있다. 1. 문자열 복사 문자열을 복사하기 위해서 아래 코드를 실행시켜 보자. #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); } string t = s;로 문자열을 복사해놓고 출력을 했다. 입력값으로 s: emma 라고 줬을 때, 나오는 출력 값은 둘 다 Emma로 나온다. s는 emma, t는 EMMA 로 예상했는데, 예상 과는 다른 결과가 나왔다. s 변수에는 문자열 emma가 아닌 문자열 emma가 있는 메모리 주소가 저장되기 때문이다. t도 ..