[[프로그래밍_NOTE]]/C , C++ 39

메모리 사상 함수 , 행우선 저장

참고 : 새표준 C , C99 (김명호 저) 예시) int a[5] , b[3][5] , c[2][3][5] 컴파일러는 문장에서 a[i]와 같은 배열 표현이 나오면 이 a[i]를 a[0]으로보터 i번째 원소라는 것을 나타내는 포인터 수식으로 바꾼다. 즉 a[i]는 *(&a[0] + i) 로 변환이 된다. 이차원 배열 b도 마찬가지이다. 문장에서 b[i][j]와 같은 배열 표현이 나오면 컴파일러는 이것이 b[0][0]으로부터 몇 번째 원소라는 것을 나타내는 포인터 수식으로 바꾼다. 어떻게 바뀌는지 살펴보자. b배열을 그림으로 나타내면 다음과 같다. 다차원 배열도 메모리에 저장될 때에는 1차원으로 저장된다. 다차원 배열을 1차원에 저장하는 방법에는 두 가지가 있다. 첫 번째는 하위 차원 원소를 먼저(행우선)..

문자열 계산기 일부 GetToken() 함수 구현

////////////////////////////////////// Written by SeungHwan 2008.08.20 File of GetToken() 기능 : 문자열로 입력된 수식을 구분 ////////////////////////////////////// #include int GetToken(char* temp , char* buffer) { static int i_T_Count=0; static int i_B_Count=0; while(temp[i_T_Count]) { while(temp[i_T_Count] ==' ') { i_T_Count++; } for(i_B_Count=0 ; temp[i_T_Count] !=' ' && temp[i_T_Count]!=NULL ; i_B_Count++..

shollow copy , deep copy

// 얕은 복사 문제 ////////////////// // shollow copy error ////////////// #include #include #include void main() { char *Name1; char *Name2; char temp[1024]; printf("이름1 : "); gets(temp); Name1 = (char*)malloc(strlen(temp)+1); strcpy(Name1 , temp); Name2 = Name1; printf("=================\n"); printf("이름1 : %s\n", Name1); printf("이름2 : %s\n", Name2); free(Name1); free(Name2); } // 깊은 복사 //////////////..

gets() 안전한 사용법

// 문제가 될수 있는 소스 ////////////////////// #include void main() { char Name[5]; char Addr[5]; char TelNo[5]; printf("이름 : "); gets(Name); printf("주소 : "); gets(Addr); printf("전화 : "); gets(TelNo); printf("이름 : %s\n", Name); printf("주소 : %s\n", Addr); printf("전화 : %s\n", TelNo); } // 결과 화면 ////////////////////////////// ※ gets() 는 버퍼 오버플로우 검사를 하지 않기때문에 사용자가 배열의 크기를 알고 있지 못하다면, 다른 배열의 영역을 침범하기 쉽다. // ..

함수 포인터 연습

// [[ 1 ]] /////////////////////////////////////////// // 사용자 입력에 따라 선택적으로 함수를 호출할 수 있다. //////////////////////////////////////////////////// #include void foo() { printf("foo\n"); } void goo() { printf("goo\n"); } void main() { void (*p[2])() = {foo,goo}; int iChoice; scanf("%d",&iChoice);fflush(stdin); switch(iChoice) { case 0: p[0](); break; case 1: p[1](); break; } } // [[ 2 ]] /////////////..