개인공부/C언어(71)
-
C언어 - 파일 입출력
우리가 C언어로 작성하고 실행시키면 운영체제 사이에 스트림이 3개 생긴다 데이터가 시냇물처럼 흘러서 왔다 갔다 할수있는 통로 1. stdout 표준 출력 - 화면출력 장치, 파일 2. stderr 표준 에러 - 화면출력장치, 파일 3. stdin 표준 입력 - 키보드 입력 버퍼 : 데이터 하나씩 오가는게 아니라 버스처럼 많이 채워 오가는것. 게임 저장파일로 캐릭터의 레벨이나 상황등등을 저장해서 첨부터 하는게 아니라 로드해서 저장된 내용부터 게임하는것 데이터를 저장하거나 읽어올때는 2가지 모드를 사용할수있다. 1. 텍스트 파일io스트림 2. 바이너리파일 io스트림 둘다 같이 사용할수도 있다. 텍스트 파일 : 직접적으로 파일을 열어서 볼수 있는것들 (메모장, 노트패드) 문자들을 화면에 그려주는게 운영체제. ..
2020.11.13 -
C언어 - 멀티쓰레딩 (Multi - Threading)
Main Thread - 주된 맥락 Thread 0~n : 이야기 도중 옆으로 새서 부가 설명하는것. 이야기가 병렬로 진행되는것. 여행중 두그룹으로 나뉘고 번갈아가면서 보여주는 형식(동시에 진행) 같은 함수의 여러개의 쓰레드가 동시에 진행. 쓰레드가 3개 돌면 함수의 사본이 3개가 돌아야한다. 하나의 전역변수를 여러개의 쓰레드가 동시에 쓰려고 하면 경쟁이 발생한다. 메모리에 저장되있는 값을 cpu에 전송하면 register에 있는 임시공간에 놓고 작업하고 결과값을 메모리에 반환 첫번째 쓰레드가 메모리로부터 cpu로 들고와서 작업하는 동안 다른 스레드가 재빨리 메모리에 있는 값을 바꾼다면 문제가 생긴다. 출처 : 홍정모의 따라배우는 C언어
2020.11.13 -
C언어 - 동적 할당 메모리와 저장 공간 분류
동적메모리 할당을 받으면 운영체제가 포인터만 넘겨준다. Stack -> (지역변수) 메세지 Local pointer : &message(banana) 주소를 저장 Stack -> (지역변수) 함수 Function pointer : function pointer 자체의 주소를 저장 프로그램코드 -> 문자열 String data : message 자체의 주소를 저장 프로그램코드 -> Function address : void func() 자체의 주소/f_ptr(포인터 변수에 저장되있는 주소값) 프로그램코드 -> Function address : main 함수의 주소 Stack(초기화된 전역/정적변수) -> Global variable : 전역변수 g의 주소(&g) Heap = Allocated memory ..
2020.11.13 -
C언어 - 동적 할당 메모리를 배열처럼 사용하기
#define _CRT_SECURE_NO_WARNINGS #include #include // malloc(), free() int main() { /* One variable */ /*int* ptr = NULL; ptr - (int*)malloc(sizeof(int) * 1); if (!ptr) exit(1); *ptr = 1024 * 3; printf("%d\n", *ptr); free(ptr); ptr = NULL;*/ /* 1D array*/ //int n = 3; //int* ptr = (int*)malloc(sizeof(int) * n); ////얼마나 메모리를 동적할당으로 받아와 그 메모리의 첫번째 주소를 ptr에 저장 //// 힙에 들어가있는 ptr 메모리는 프로그램 끝날때까지 남아있는다..
2020.11.13 -
C언어 - 메모리 누수와 free()의 중요성
C언어는 메모리 반납이 중요하다. 메모리를 반납하지 않아 생기는 현상이 메모리누수 현상 #define _CRT_SECURE_NO_WARNINGS #include #include // malloc(), free() int main() { printf("Dummy Output\n"); { int n = 100000000; int* ptr = (int*)malloc(n * sizeof(int)); if (!ptr){ printf("Malloc() failed\n"); exit(EXIT_FAILURE); } for (int i = 0; i < n; ++i) ptr[i] = i + 1; } // what happen? // 메모리오버 , Malloc failed가 일어난다. return 0; } 출처 : 홍정모의..
2020.11.13 -
C언어 - 메모리 동적 할당!! (Dynamic Storage Allocation)
너무 떨린다... 잘 이해할수 있겠지? 안되면 다시 보고 다시 보자. 포인터만 가져오고 인식자가 없다! 메모리의 위치는 Heap이고 프로그래머가 결정한다. 메모리를 다썼다고 판단되면 프로그래머가 수동으로 반납한다. 혹은 운영체제가 프로그램이 끝났다고 판단되면 강제 회수한다. (Automatic 같은 경우 블록안에서 선언되고 스택안에 들어가고 나오는것이 자동적으로 결정됨.) 런타임이 되봐야 메모리 크기를 알수있는 경우. 해결 방법 Stack에 들어가는 메모리를 크게 잡는 방법. 대부분은 운영체제가 자유공간에 가상메모리를 만들어서 배당해줌. 위의 경우 변수에 의해서 메모리 크기가 달라지고 있음. int main() { int n=0; char* arr= (char*)malloc(sizeof(char * n)..
2020.11.13