본문 바로가기

C언어 자습

(22)
기타 동적 할당 함수(calloc, realloc) calloc, realloc malloc 외에도 heap영역에 접근하게 해주는 함수가 더 있습니다. calloc과 realloc 입니다. 어원 부터 살펴 보겠습니다. calloc 은 clear와 allocation의 줄임 표현입니다. clear = 청소하다 allocation = 할당 할당된 heap 영역을 청소하라는 의미입니다. realloc의 어원입니다. reallocation 이라는 단어가 따로 존재하는데 re+allocation 라고 봐야 되겠죠 다시 할당하다 라는 말입니다. calloc은 메모리를 0으로 초기화 하는 역할을 하고 realloc은 메모리를 늘리거나 줄이는 역할을 합니다. 어원을 알아야 하는 이유가 여기 더 있습니다. 어원을 모르면 그냥 늘리거나 줄이는 거라고 알게 되겠지만 어원을 ..
메모리 동적 할당 (malloc, free) 프로그래머가 사전에 사용자의 동작을 예상해서 변수나, 배열선언을 통해 메모리 공간을 활용하는것을 배워왔습니다. STACK 영역을 사용하는 거죠. 운영체제가 알아서 메모리를 관리합니다. 대표적으로 함수 내의 지역변수가 있겠죠. 호출시 메모리를 할당 했다가 호출이 끝나면 자동으로 알아서 해제 합니다. 사용자의 활동범위를 전부 예상하는것이 가능 하다면 STACK 메모리만 활용해서 모든 동작이 문제없이 동작할 것입니다. 그렇다면 좋겠지만 프로그램이 실행중인 와중에 저장공간 할당이 필요할 수도 있습니다. HEAP메모리 영역에는 이렇게 프로그램 실행중에도 저장공간을 할당할 수가 있어요. 할당한 메모리를 다시 사용하기 위해서는 반납해줘야 합니다. 이런 행위를 동적할당이라고 합니다. malloc, free 함수 mal..
void 포인터 메모리 주소를 의미하는 포인터변수 앞에 붙은 자료형은 해당 포인터 변수가 어떤 값의 변수를 참조할 것인지를 의미 합니다. int* pnum; 이 의미하는 것은 pnum이 참조하는 대상의 값이 int 형이라는 것을 의미 하죠. void 포인터란 가리키는 대상의 자료형이 정해지지 않은 포인터를 의미합니다. void 포인터 사용 예제 #include int main(void) { int a = 10; //int variable double b = 3.5; //double variable void* vp; //void pointer vp = &a; // assign void pointer to int variable printf("a : %d\n", *(int*)vp); vp = &b; // assign voi..
함수 포인터 함수 포인터란? 함수의 정의가 있는 부분의 메모리 주소를 의미 합니다. 재사용성과 가독성을 위해 유용하게 사용하는 함수, main 함수와는 다른 곳에 위치하고 있지만 그들도 결국 메모리상에 존재하는 것이었습니다.이 함수를 실행하기 위해서는 결국 메모리 위치를 알아야 하는 것입니다. #include int sum(int, int);// 함수 선언 int main() { int (*fp)(int, int); //함수 포인터 선언 int res;//반환값을 저장할 변수 fp = sum;//함수명을 함수 포인터에 저장 res = fp(10, 20);//함수 포인터로 함수 호출 printf("result : %d\n", res); //반환값 출력 return 0; } int sum(int a, int b) // ..
2차원 배열 배열을 선언할 때, 필수적으로 필요한 것이 있다. 자료형과 변수(배열명), 그리고 배열 크기가 필요한데 그 이유가 있다. 배열은 연속된 메모리 주소값을 사용하기 때문에 사전에 설정된 주소값이 침범되지 않도록 잡아 두는 과정이 필요한 것이다. 값없이 선언만 하는 것도 가능하다는건, 값을 일부만 주는것도 가능하다는것. 이럴 때는 값이 없는 부분이 0으로 자동 초기화 된다. 만약 int arr[5][5] = {{1},{2,3},{4,5,6},{7,8,9,0}}; 라고 초기화 했다면 1 0 0 0 0 2 3 0 0 0 4 5 6 0 0 7 8 9 10 0 0 0 0 0 0 값을 주지 않은 상태에서는 이렇게 생긴 배열이 만들어 지는 것입니다. 중단점을 이용해서 메모리값이 어떻게 구성되었는지 살펴보면 위와 같습니다..
정적 지역 변수static, 레지스터 변수register 지역 변수 선언시 static 예약어를 사용하여 정적 지역변수를 만든다. 함수가 반환값을 반환하고 호출이 종료된 후에도 static변수는 메모리 저장공간을 계속 유지한다. #include #include void auto_func(void); void static_func(void); int main() { int i; printf("일반 지역 변수(auto)를 사용한 함수...\n"); for (i = 0; i < 3; i++) { auto_func(); } printf("정적 지역 변수 (static)을 사용한 함수...\n"); for (i = 0; i < 3; i++) { static_func(); } return 0; } void auto_func(void) { auto int a = 0;//그..
문자열 연산함수(3) 문자열을 비교하는 strcmp, strncmp함수 strcmp(문자열1, 문자열2) 간단한 사용법과 강력한 효율을 가진 함수입니다. 입력값을 검사하는 과정에서 많이 활용할 수 있을것 같습니다. 문자열1과 문자열2를 비교한 뒤에 정수를 반환합니다. 맞습니다. 반환값이 int 자료형인 함수입니다. 완전히 같으면 0을 반환하는데 다를 경우 1 또는 -1이 반환되게 됩니다. 이는 문자열1과 문자열2를 비교해서 결정하는데요. 가나다순, 그러니까 영어로는 abc 순이겠네요. 알파벳 오름차순, 보통 학교 출석번호를 정할 때 오름차순으로 많이 정하죠? 출석번호순서대로 줄을 세운다고 칩시다. 이때 문자열1이 앞에있으면 -1이 반환되고 (먼저간다) 문자열2가 앞에 있으면 1이 반환됩니다. (나중에 간다) 이게 가능한 이유는 아스키코드가 a~z까지 오름차순으로 정렬되어있기..
문자열 연산 함수(2) strcat, strncat, strlen strcat 뜯어보기 strcat(char *_Destination, const char *_Source) cat은 concatenate 라는 단어에서 따왔다. 사슬같이 잇다; 연쇄시키다; 결부[연결]시키다, 연관시키다 라는 뜻이 있다. strncat 뜯어보기 strncat(char *_Destination, const char *_Source, size_t _Count) strlen 뜯어보기 strlen(const char *_Str) 함수의 반환값은 size_t __cdecl 자료형을 가지고 있는데 뜯어보면 unsigned long long 이다. 문자열은 정수형태로 표시 되기 때문에 그냥 정수형이라고 보면 된다. 예제로 알아보는 사용 #include #include int main() { char ..