본문 바로가기

PROGRAMMING LANGUAGE/C

(24)
24강 메모리 동적할당 메모리의 구성 프로그램 실행 시 운영체제에 의해서 마련되는 메모리 구조는 네 개의 영역으로 구분이 된다. 코드 영역 데이터 영역 힙 영역 스택 영역 메모리 영역별로 저장되는 데이터 유형 코드 영역 실행할 프로그램의 코드가 저장되는 메모리 공간이다. CPU는 코드 영역에 저장된 명령문들을 하나씩 가져가서 실행을 한다. 데이터 영역 전역변수와 static으로 선언되는 static 변수가 할당된다. 이 영역에 할당되는 변수들은 프로그램의 시작과 동시에 메모리 공간에 할당되어 프로그램 종료 시까지 남아있게 된다는 특징이 있다. 스택 영역 지역변수와 매개변수가 할당된다. 이렇듯 이 영역에 할당되는 변수들은 선언된 함수를 빠져나가면 소멸된다는 특징이 있다. 힙 영역 프로그래머가 원하는 시점에 변수를 할당하고 소멸하..
23강 파일의 입력과 출력 프로그램상에서 파일에 저장되어 있는 데이터를 참조하길 원한다면 내가 구현한 프로그램과 참조할 데이터가 저장되어 있는 파일 사이에 데이터가 이동할 수 있는 다리를 놓아야 한다. 이런 데이터 이동의 경로가 되는 다리를 '스트림(stream)'이라고 한다. #define _CRT_SECURE_NO_WARNINGS #include int main(void) { FILE* fp = fopen("data.txt", "wt"); if (fp == NULL) { puts("파일오픈 실패!"); return -1; } fputc('A', fp); fputc('b', fp); fputc('c', fp); fclose(fp); return 0; } 프로그램을 실행시켜 A,b,c를 data.txt파일에 입력시켰다. wt로 접..
21강, 22강 TYPEDEF, 공용체, 열거형 typedef의 사용법을 알아보자. #include typedef struct sbox { int mem1; int mem2; double mem3; }SBox; typedef union ubox { int mem1; int mem2; double mem3; }UBox; int main(void) { SBox sbx; UBox ubx; printf("%p %p %p \n", &sbx.mem1, &sbx.mem2, &sbx.mem3); printf("%p %p %p \n", &ubx.mem1, &ubx.mem2, &ubx.mem3); printf("%d %d \n", sizeof(SBox), sizeof(UBox)); return 0; } typedef 선언으로 데이터형의 별명을 지어줄 수 있다. 공용체를..
20강 구조체 구조체의 사용법 #include struct point { int xpos; int ypos; }; struct person { char name[20]; char phoneNum[20]; int age; }; int main(void) { struct point pos = { 10,20 }; struct person man = { "이승기", "010-1212-0001", 21 }; printf("%d %d \n", pos.xpos, pos.ypos); printf("%s %s %d \n", man.name, man.phoneNum, man.age); return 0; } #include struct point { int xpos; int ypos; }; int main(void) { struct po..
19강 함수 포인터와 void 포인터 #include int WhoIsFirst(int age1, int age2, int (*cmp)(int n1, int n2)) { return cmp(age1, age2); } int OlderFirst(int age1, int age2) { if (age1 > age2) return age1; else if (age1 age2) return age2; else return 0; } int main(void) { int age1 = 20; int age2 = 30; int first; ..
18강 다중포인터 #include int main() { int data = 5; int* p_data = &data; int** pp_data = &p_data; int*** ppp_data = &pp_data; ***ppp_data = 3; printf("data = %d\n", data); return 0; } int 타입 data 변수에 5를 대입하고 1단계 포인터 p_data에 data의 주소값을 대입한다. 2단계 포인터 pp_data에 p_data의 주소값을 대입한다. 3단계 포인터 ppp_data에 pp_data의 주소값을 대입한다. ***ppp_data = 3; 이 부분은 ppp_data를 3번 역참조하라는 코드이다. ppp_data가 가리키는 주소값으로 간 후에 pp_data -> p_data-> data..
17-1 포인터 배열과 배열 포인터 포인터 배열은 포인터가 여러개 모여있는 ' 배열 '!! 배열 포인터는 배열을 가리키는 ' 포인터 '!! 먼저 포인터 배열을 사용하는 코드를 보자. #include int main(void) { const char* arr[3]; int i; arr[0] = "BlockDMask"; arr[1] = "C Programming"; arr[2] = "point_arr"; for (i = 0; i %s\n", i, arr[i]); } return 0; } 포인터 배열을 사용하여 포인터가 가리키는 위치에 값을 대입한다. #include int main(void) { char(*arr)[3]; char tmp1[3] = { 'b', 'l', 'o' }; cha..
17강 다차원 배열 #include int main(void) { int arr1[3][2]; int arr2[2][3]; printf("arr1: %p \n", arr1); printf("arr1+1: %p \n", arr1 + 1); printf("arr1+2: %p \n\n", arr1 + 2); printf("arr2: %p \n", arr2); printf("arr2+1: %p \n", arr2 + 1); return 0; } 2차원 배열을 선언하고 2차원 배열이름을 대상으로 증가 및 감소연산을 할 경우, 연산결과는 각 행의 첫 번째 요소의 주소 값이 된다. arr1이 1행의 첫 번째 요소를 가리키면, arr1 + 1이 반환하는 주소 값은 2행의 첫번째 요소, arr1 + 2가 반환하는 주소 값은 3행의 첫 번쨰 ..