개인공부(113)
-
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 -
C언어 - 정적 변수의 외부연결 (external linkage), 내부연결 (internal linkage)
외부연결 번역단위(translation unit) : 대부분의 경우 파일. (c 파일) 컴파일러가 컴파일 할때는 c파일 단위로 한다. 따로 obj파일을 만들고 실행파일을 만들기 전에 각 obj를 linking 한다. 변수말고도 함수도 연결해준다. int g_int; int main(){ extern int g_int; // 파일안에 main()함수 밖의 g_int를 쓴다. // 내부변수로 인식안함 //extern int_int = 1024; //block scope 에러 //int g_int =123; // 밖의 global변수 g_int를 가려버려 지역변수 g_int를 쓴다. return 0; } extern으로 외부 변수를 불러올때 자료형을 붙여주지 않아도 된다. 이미 선언될때 자료형까지 다 붙어서 ..
2020.11.13 -
C언어 - 블록 영역의 정적변수
Static with no linkage는 블록안에서만 사용할수 있다. (블록안에서만 볼수있는것) void count() { int ct = 0; // count()함수가 호출될때마다 초기화가 된다. printf("count = %d %lld\n", ct, (long long)&ct); ct++; } void static_count() { static int ct = 0; // 초기화 한번만 한다! printf("static count = %d %lld\n", ct, (long long)&ct); ct++; } #define _CRT_SECURE_NO_WARNINGS #include /* Automatic storage class -Automatic storage duration, block scope,..
2020.11.13 -
C언어 - 저장공간의 다섯가지 분류 , 자동변수, 레지스터 변수
//BSS는 block started by symbol의 약어이다. .bss나 bss는 초기에 오직 제로 값으로 표시된 정적으로 할당된 변수가 포함된 데이터 세그먼트의 일부로 컴파일러나 링커에 의해 사용된다. 즉, 초기화되지 않은 전역 데이터를 위한 영역이다 5가지 분류 1.자동 2.레지스터 3.고정적, 내부연결 4. 고정적, 외부연결 5. 고정적, 연결없음 2가지 분류 non-static 1.자동 2.레지스터 static 3.고정적, 내부연결 4. 고정적, 외부연결 5. 고정적, 연결없음 데이터 또는 BSS, 고정적. 고로 프로그램이 시작과 끝까지 메모리에 끝까지 자리한다. register는 cpu에 자리한다. 할당메모리 운영체제에게 큰 공간이 필요한데 어느정도의 크기인지 확실하지 않음. 운영체제는 포..
2020.11.13