컴퓨터공부/C & C++ & STL 71

SICP : 위대함과 오묘함

살면서 위대함과 오묘함을 구별하지 못한 경우가 나는 꽤나 많다. 위대함이란 보통 사람이 넘볼 수 없을 만큼 대단해서 오히려 하찮게 보일 때가 많았다. 반면에 오묘함은 꽤나 납득이 가면서도 신비함에 가득차 있는 무언가처럼 보였다. 그렇지만 수많은 실수에도 불구하고, 위대함과 오묘함을 알아채는 건 아직까지도 정말 힘들일이기는 하다. 어떤 사람이나 기술이 위대한지 알기 위해서는 그 대상에 대해서 잘 알아야 한다. 문제는 위대한 존재는 위대한 만큼 이해하기 위해서는 앞에서 알아야할 것이 많다는데 있다. 그렇기 때문에, 앞에서 필요한 지식을 얻지 못했다면 대상이 위대한지 위대하지 않은지 구별할 수 없다. 반면에 오묘한 건 아주 쉽게 발견할 수 있다. 오묘하다는 건 완전히는 아니지만 어느 정도 그것을 알게 되었다는..

변수의 scope, 스코프, 범위

1. 지역변수 (local variable / automatic variable) 지역변수를 다른 표현으로 자동변수라고도 한다. 지역내에 생성되었다가 지역을 벗어나면 자동으로 사라진다고 해서 붙여진 이름이다. 원래 원칙적으로는 지역변수 선언시, 앞에 auto 라는 키워드를 붙여 주게 되어있지만, 생략이 가능하며, 생략하는게 일반적이다. 중괄호에 형성되는 지역내에 형성되는 변수 => 선언된 지역내에서만 유효하다. 초기화를 안했을 경우 쓰레기 값이 들어가게 된다. int fct_one(void) { int one = 0; int two = 0; … retrun 0; } int fct_two(void) { int two = 0; one = 10; // error!!! … return 0; } 지역변수(자동변수..

포인터와 참조자

//---------------------------------------------------------------------------------- //항 목 | 포인터 | 참조자 | 비 고 //---------------------------------------------------------------------------------- //Null 값 | 허용 |허용안함 | int *p; // 가능 // | | | int &r; // 불가능 //---------------------------------------------------------------------------------- //주소값 재 대입 | 허용 |허용안함 | p=&a // 포인터 p에 변수 a의 주소 대입 (가능) // ..

참조자의 오묘함

다음의 결과를 예측해 보세요!! 정답은 밑에.. + #include int x; int& f(int p) { p++; x = p; return x; } void main() { int y = 10; x = 12345; // 여기를 바꿀 것 f(y) = f(1) + 10; printf("result = %d\n",x); } + 해설 ↓↓↓↓ #include 1: int x; 2: int& f(int p) 3: { 4: p++; 5: x = p; 6: return x; 7: } 8: void main() 9: { 10: int y = 10; 11: x = 12345; // 여기를 바꿀 것 12: f(y) = f(1) + 10; 13: printf("result = %d\n",x); 14: } + 정답 : (..

CRT(C Runtime Library)의 디버그 기능 사용하기

CRT Debug 기능 사용법 일반적으로 가장 잡기 힘든 버그의 하나로서 메모리 누수, 메모리 Overwrite등을 꼽을 수 있다. 이런 문제점을 해결하기 위해 CRT(C Runtime library)에서는 여러가지 다양한 메모리 관련 디버그 함수들을 제공한다. 그러나 이것들이 디폴트로 사용하기 힘들게 꺼져 있기 때문에 대부분의 프로그래머들은 이 사실을 알지 못하는 경우가 많다. 그래서 이 글에서는 CRT의 디버그 관련 함수들에 대해 알아보고 어떻게 사용하는 것이 좋은지에 대해 논해 보려고 한다. John Robbins(필자가 가장 좋아하는 프로그래머 중의 한명)가 지은 Debugging Applications 이라는 책에도 좋은 내용들이 있으니 참고하기 바란다. 그러나 여기 나온 팁은 그 책에는 나와 ..

메모리 릭(메모리 유출, memory leak)을 잡아보자

많은 프로그래머들이 프로그램을 짜면서... 메모리 릭을 많이 발생시킵니다.. 대수롭지 않게 생각하는 프로그래머들이 많은데.. 실상은 가장 심각한 버그 중에 하나입니다.. 당부 말씀드리자면... 제발 그러지 말아 주세요.. ㅎㅎ 그럼 메모리 릭을 어떻게 잡아야할까요.. 코드 짤때부터 새지 않도록 짜는게 중요하지만.. 인간인 이상 완벽할 수 없습니다.. 그럴땐 도움을 받아야 합니다.. 다음 코드 보시죠.. #include #ifdef _DEBUG #define new new(_CLIENT_BLOCK, __FILE__, __LINE__) #endif void main() { _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); int* a = new..

가변인수

아래에 있는 코드를 보면 쉽게 파악 할 수 있을 것이다. 다음과 같은 형식으로 접근하면 'format' 에 들어 있는 데이터가 'tiny_printf' 문의 처음 인자로 들어가게 된다. 그럼 'format'에는 "sddd"가 들어있게 되겠다. 'va_arg'를 이용하면 다음 인자(result..., 3, 5, 1)를 접근할 수 있다.(va_arg는 자동으로 인덱싱하여 다음 인자를 접근하는 것 같다.) + printf()와 scanf()와 같은 가변 인자를 받는 함수를 만들거나 이 함수를 덮어 쓰는 wrapper를 만들려면 가변 인자를 처리할 줄 알아야 합니다. 가변 인자를 처리할려면 다음과 같은 data type과 함수 (또는 매크로 함수)를 써야 합니다: va_list -- type va_start(v..

스트림을 읽어 들여서 보자..

#include #include int main() { void *buf; FILE *infp = fopen("ezboot.x5", "rt"); FILE *outfp = fopen("out_ezboot.x5", "w+"); buf = malloc(4*4); // 32bits fread(buf, 1, 4, infp); fwrite(buf, 1, 4, outfp); printf("%x", *(int*)buf); } 뭐.. 별거 없는 코드이다.. 끝에 void 형인 buf를 캐스팅 연산을 이용하여 출력할 수 있게 해준다는 것을 빼먹지 말자.. printf에서는 void형은 출력못하니 int * 로 형변환을 한 다음에 안에 있는 데이터를 출력한다.