이전 글: 9. 파일 입출력에서 계속 메모리의 구성 - 코드 영역: 실행할 프로그램의 코드가 저장되는 메모리 공간, CPU는 코드 영역에 저장된 명령문들을 하나씩 가져가서 실행한다. - 데이터 영역: 전역변수와 static으로 선언되는 static 변수가 할당. 프로그램 종료 시까지 남는다. - 스택 영역: 지역변수와 매개변수가 할당된다. 함수가 종료되면 소멸된다. - 힙 영역: 프로그래머가 원하는 시점에 변수를 할당하고 소멸하도록 지원하는 공간 malloc 과 free 생성과 소멸 시기가 지역변수나 전역변수와 다른 유형의 변수는, malloc 과 free 함수로 힙 영역에 할당하고 소멸할 수 있다. 먼저, stdlib.h를 추가해준다. #include void * malloc(size_t size); ..
이전 글: 8. 구조체와 typedef에서 계속 파일 입출력 파일에 저장되어 있는 데이터를 참조하길 원하는 경우, 즉 파일을 읽거나 쓰길 원하는 경우 가장 먼저 해야할 일은, 파일 사이에 데이터가 이동할 수 있는 다리를 놓는 일이다. 즉, 프로그램과 파일 사이에 "스트림(stream)"을 형성해야 한다. 스트림은 운영체제에 의해서 형성되는 소프트웨어적인 상태를 의미하는 것일 뿐이기 때문에, "파일로부터 데이터를 읽거나 쓸 기본적인 준비가 됐구나"라고 이해하면 된다. 파일 열기 FILE * fopen(const char * filename, const char * mode); --> 성공 시 해당 파일의 FILE 구조체 변수의 주소값, 실패 시 NULL 포인터 반환 FILE 구조체 변수의 멤버에 직접 접근..
이전 글: 7. 표준 입출력, 문자와 문자열 처리 함수에서 계속 구조체(Structure) 하나 이상의 변수를 묶어 새로운 자료형을 정의하는 도구 struct type_name { 멤버 선언; }; 구조체 변수 선언 struct type_name val_name; 구조체 멤버를 가져올 때엔 val_name.member_name 으로. struct point { int x; int y; }; 초기화는 배열과 동일한 방식으로 할 수 있다. struct point = { 10, 20 }; 구조체 멤버 중에 배열이나 포인터 변수가 있을 경우, 포인터 변수의 접근 방식을 취한다. struct person { char name[20]; int age; }; struct person man; strcpy(man.na..
이전 글: 6. 함수 포인터와 void 포인터에서 계속 입출력 장치와 스트림 입출력 장치 = 키보드, 마우스, 파일!!!, 카메라, 저장장치 등등.. 스트림 = 한 방향으로 흐르는 데이터의 흐름 = 데이터의 이동수단 운영체제에서 제공하는, 소프트웨어로 구현되어 있는, 가상의 다리(브릿지) 운영체제는 외부 장치와 프로그램과의 데이터 송수신의 도구가 되는 스트림을 제공하고 있다. 콘솔 입출력을 위한 '입력 스트림'과 '출력 스트림'은 프로그램 시작과 동시에 자동으로 생성된다. 프로그램이 종료되면 자동으로 소멸된다. 이들은 표준 스트림이라 한다. * stdin 표준 입력 스트림 (키보드) * stdout 표준 출력 스트림(모니터) * stderr 표준 에러 스트림(모니터) 표준 입출력과 버퍼 표준 입출력 함수..
이전 글: 5. 다차원 배열과 포인터에서 계속 함수 포인터 변수만 메모리에 저장되는 것은 아니다. 함수들도 바이너리 형태로 메모리 공간에 저장되고, 호출 시 실행된다. 메모리 상에 저장된 함수의 주소 값을 저장하는 포인터 변수가 바로 '함수 포인터 변수'이다. 함수는 프로그램 실행 시 '메인 메모리'에 저장되어 실행되고, 함수의 이름도 함수가 저장된 메모리 공간의 주소 값을 의미한다. (배열의 이름과 마찬가지로 함수의 이름도 그 형태가 상수이다) 함수 이름의 포인터의 형(type)은 반환형과 매개변수의 선언을 통해서 결정짓는다. 예: int SimpleFunc(int num) ==> 반환형이 int이고 매개변수로 int형 변수가 하나 선언된 포인터 형 함수 포인터 변수 int (*fptr) (int) -..
이전 글: 4. 포인터와 배열에서 계속 다차원 배열 int[행][열] 2차원 배열도 메모리상에는 1차원 형태로 존재한다. 포인터의 포인터 = 더블 포인터 변수 포인터를 가리키는 값 int n = 3; int *p = &n; int **pp = &p; (예: 포인터 변수를 이용한 Swap) (p.364) 포인터 배열과 포인터 배열의 포인터 형 int * arr[3] = {p1, p2, p3}; // int형 포인터를 인자로 가지고 있는 배열 int **ptr = arr; // int형 포인터를 가리키는 포인터 (더블 포인터) 다중 포인터가 왜 필요한가? - 자료구조를 공부하다 보면 완전 필요하다 - 함수 내에서 함수 외부에 선언된 변수에 접근하는 방법을 제시해준다. 다차원 배열과 포인터 2차원 배열이름의 ..
이전 글: 3. 배열과 문자열에서 계속 포인터 변수 "포인터 변수란 메모리의 주소 값을 저장하기 위한 변수이다." & 연산자: 피연산자의 주소값을 반환하는 연산자 포인터 변수의 크기는 하드웨어와 운영체제에 따라 달라진다. 32비트 시스템에서는 주소값을 32비트로 표현하기 때문에 포인터 변수의 크기는 4 바이트, 64비트 시스템에서는 64비트로 표현하기 때문에 8바이트 크기를 갖는다. int * : int 형 포인터 double * : double 형 포인터 int num1 = 5; double *pnum1 = # // 변수의 자료형에 맞지 않는 포인터 변수의 선언은 문제가 될 수 있다. // (컴파일 에러는 발생하지 않는다) int *ptr1 = 0; 또는 int *ptr2 = NULL; 0과 N..
이전 글: 2. 함수와 변수에서 계속 배열 선언 int arr[3]; int len = 3; int arr2[len]; int arr3[3] = {1, 2, 3}; int arr4[] = {1, 2, 3}; // 컴파일러에 의해 자동으로 3 삽입 int arr5[5] = {1, 2, 3}; // 나머지 부분은 0으로 채워짐 !! 배열의 크기를 벗어난 인덱스에 접근해도 컴파일 에러가 발생하지 않는다. 컴파일러는 배열 접근에 있어서는 유효성 검사를 진행하지 않기 때문이다. 이 경우, 할당하지 않은 메모리 공간을 침범하게 되므로 반드시 주의해야 한다. int arr[3]; arr[3] = 10; // 컴파일 에러를 발생하지 않는다. 배열의 이름을 대상으로 하는 sizeof 연산의 결과는 '바이트 단위의 배열의..
이전 글: 1. 프로그램의 기본 구성과 기본 자료형에서 계속 printf \ = escape squence 서식문자 %d char, short, int 부호있는 10진수 정수 %ld long 부호있는 10진수 정수 %lld long long %u unsigned int %o unsigned int 8진수 정수 (%#o 로 출력하면 07과 같은 식으로) %x, %X unsigned int 16진수 정수 (%#x 로 출력하면 0x7과 같은 식으로) %f float, double %lf long double %e, %E float, double 10진수 방식의 부동소수점 실수 %g, %G float, double 값에 따라 %f, %e 중 선택 %c char, short, int 값에 대응하는 문자 %s ch..
이전 글: C 프로그래밍 요약 노트에서 계속 프로그래의 기본 구성 int main(void) { return 0; // 정상 종료 코드 0 } 변수와 연산자 '값을 저장할 수 있는 메모리 공간에 붙은 이름, 혹은 메모리 공간 자체를 가리켜 변수라 한다.' int num; int : 정수의 저장이 가능한 메모리 공간을 할당 num : 그리고 메모리 공간의 이름을 num이라 한다. "변수를 선언만 하고 초기화하지 않으면 쓰레기 값지 저장된다." #include int main(void) { int num1; num1=0; int num2; // 컴파일 에러가 발생할 수 있다. 가능하면 선언은 가장 앞쪽에 둔다. num2 =0; } 기본 자료형 int, float 등 자료형을 나눈 것은, 정수냐, 실수냐에 따..