전체 글(139)
-
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 -
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