7.13.3 stdlib.h     [gdoc]     [smts]

 헤더파일 stdlib.h에는 동적 메모리 할당, 난수 발생 및 문자열 변환 등을 수행하는 함수들이 포함되어 있다.


함수 선언

기능

void * malloc ( size_t size )

size 바이트의 메모리를 힙에서 할당하여 포인터를 반환

void * calloc ( size_t num, size_t size )

(num * size) 바이트의 메모리를 힙에서 할당하여 포인터를 반환한다.

void * realloc ( void * ptr, size_t size )

ptr이 가리키는 메모리를 size 바이트만큼 힙에서 재할당

void free ( void * ptr )

ptr이 가리키는 메모리를 해제한다.

void srand ( unsigned int seed )

의사 난수 발생기를 seed로 초기화한다. 보통 seed는 time(NULL)로 설정된다.

int rand ( void );

0부터 RAND_MAX 사이의 의사 난수를 반환한다.

int atoi ( const char * str );

str을 int로 변환한다.

long int atol ( const char * str );

str을 long으로 변환한다.

double atof ( const char * str );

str을 double으로 변환한다.

int abs ( int n )
long int labs ( long int n )

n의 절대값(absolute value)를 구한다.

void abort ( void );

현재 프로세스를 비정상적으로 종료한다.

void exit ( int status );

현재 프로세스를 정상적으로 종료한다.


이 중에서 malloc(), calloc(), free()함수는 6장에서 설명할 바가 있다.


 난수(random number)란 ‘특정한 생성 규칙이 없는 임의의 수’이며 난수를 발생하는 함수 rand()가 stdlib.h 에 포함되어 있다. rand 함수는 0부터 RAND_MAX (gcc의 경우 32,767로 정의되어 있다.) 사이의 임의의 정수를 반환하는 함수이다. 다음은 10개의 난수를 연속으로 생성하는 간단한 예제이다.


071203-01.c

#include <stdio.h>
#include <stdlib.h>

int main() {
   for(int i=0;i<10;i++){
       printf("%d, ", rand());
   }
}

D:\OneDrive\proj_c>cc 071203-01.c & a
41, 18467, 6334, 26500, 19169, 15724, 11478, 29358, 26962, 24464,
D:\OneDrive\proj_c>a
41, 18467, 6334, 26500, 19169, 15724, 11478, 29358, 26962, 24464,
D:\OneDrive\proj_c>a
41, 18467, 6334, 26500, 19169, 15724, 11478, 29358, 26962, 24464,
D:\OneDrive\proj_c>a
41, 18467, 6334, 26500, 19169, 15724, 11478, 29358, 26962, 24464,
D:\OneDrive\proj_c>cc 071203-01.c & a
41, 18467, 6334, 26500, 19169, 15724, 11478, 29358, 26962, 24464,
D:\OneDrive\proj_c>a
41, 18467, 6334, 26500, 19169, 15724, 11478, 29358, 26962, 24464,


그런데 실행을 시킬때마다 같은 난수가 발생함을 알 수 있는데 이러면 난수를 사용하는 의미가 없다. 만약 rand()함수를 이용해서 주사위 숫자를 만들었는데 계속 같은 패턴이 나온다면 쓸모가 없을 것이다. 실행시킬 때마다 다른 난수를 발생시키려면  srand()함수로 초기화 시켜야 실행할 때마다 다른 난수가 발생하게 된다. 보통 srand()함수는 다음과 같이 time()함수를 이용하여 호출한다.


srand(time(NULL));

time(NULL)은 1970년 1월1일 0시부터 현재까지의 경과 시간을 초 단위로 반환해 주는 함수로서 time.h 헤더 파일에 포함되어 있다. 이렇게 하면 난수를 발생시킬 때마다 다른 패턴으로 생성된다. 이것을 이용하여 주사위를 10번 던지는 프로그램을 작성하면 다음과 같다.


071203-02.c

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
   srand(time(NULL));
   for(int i=0; i<10; i++) {
       unsigned char dice = rand()%6+1;
       printf("%d, ", dice);
   }
}

실행 결과

D:\OneDrive\proj_c>cc 071203-02.c & a
6, 4, 4, 4, 6, 2, 2, 3, 1, 1,
D:\OneDrive\proj_c>a
3, 3, 1, 4, 5, 2, 4, 1, 1, 6,
D:\OneDrive\proj_c>a
4, 2, 3, 2, 6, 1, 1, 2, 5, 6,
D:\OneDrive\proj_c>a
1, 3, 5, 4, 5, 4, 5, 3, 4, 2,
D:\OneDrive\proj_c>a
4, 5, 5, 5, 6, 1, 4, 4, 2, 4,

주사위 수인 1부터 6까지 발생시키기 위해서 rand() 를 6으로 나눈 나머지에 1을 더했음을 눈여겨 보기 바란다. 이렇게 하면 [1, 6] 범위의 정수가 임의로 생성된다. 또한 srand()함수를 사용하였으므로 실행 시킬때 마다 다른 패턴이 생성된다.



'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

7장 연습문제 풀이 동영상  (0) 2016.06.04
4장 연습문제 풀이 동영상  (0) 2016.05.31
7.13.2 문자열 관련 함수 string.h  (0) 2016.05.30
7.13.1 수학함수 math.h  (0) 2016.05.30
7.13 표준함수  (0) 2016.05.30
Posted by 살레시오
,