[C 언어] 동적 메모리

    동적메모리

     

    동적메모리 할당, 해제는 전부 개발자 몫

    포인터로 동적메모리 할당시 꼭 잡아줘야 한다.

    포인터로 동적메모리 해제를 해줘야 한다.

     

     

    동적메모리할당함수

    1. malloc() : 동적메모리가 쓰레기값으로 할당.

    2. calloc() :  동적메모리의 값이 0으로  세팅해서 할당.

    3. realloc() : 메모리가 재할당이 되지만, 잘 사용하지 않는다.

     

    동적메모리 해제 함수

    free()

     

    void * malloc(size_t); // size_t == unsinged int 부호 없는 int와 같은 말이다.

    //void 포인터를 잡은 이유는 개발자가 나중에 캐스팅 하라는 의미이다.

     

     

    1. malloc()

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    int main() {
    
    	int num;
    	int* p;
    	int i;
    
    	scanf("%d", &num);
    
    	// int 타입은 4byte이므로 입력받은 값 * 4를 입력한다.
    	//malloc(num*4);
    	//int 크기는 4이므로 sizeof를 이용한다.
    	// malloc는 void 타입이므로 int타입으로 형변환 시켜준다.
    	p = (int) malloc(num * sizeof(int));	// 동적 메모리 할당.
    
    	for (i = 0; i < num; i++)
    	{
    		p[i] = i;
    	}
    
    	for (i = 0; i < num; i++)
    	{
    		printf("%d\n", p[i]);
    	}
    
    	//p가 가르키고 있는 주소를 지우라는 의미이다.
    	// 안 써도 error는 발생하지 않는다. 그러나 메모리가 남아 있으므로 지우는 것이 좋다.
    	free(p);	//동적 메모리 해제
    
    	return 0;
    }

    malloc는 시작할때 초기값을 안 주면, 알 수 없는 값으로부터 시작한다.

    그래서 반드시 초기값을 지정해줘야 한다.

     

     

    2. Calloc()

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    int main() {
    
    	int num;
    	int* p;
    	int i;
    
    	scanf("%d", &num);
    
    	// int 타입은 4byte이므로 입력받은 값 * 4를 입력한다.
    	//malloc(num*4);
    	//int 크기는 4이므로 sizeof를 이용한다.
    	// malloc는 void 타입이므로 int타입으로 형변환 시켜준다.
    	// 동적 메모리 할당.
    	//p = (int)malloc(num * sizeof(int));	// malloc
    	p = (int*)calloc(num, sizeof(int));	// calloc
    
    	/*for (i = 0; i < num; i++)
    	{
    		p[i] = i;
    	}*/
    
    	for (i = 0; i < num; i++)
    	{
    		printf("%d\n", p[i]);
    	}
    
    	//p가 가르키고 있는 주소를 지우라는 의미이다.
    	// 안 써도 error는 발생하지 않는다. 그러나 메모리가 남아 있으므로 지우는 것이 좋다.
    	free(p);	//동적 메모리 해제
    
    	return 0;
    }

    Calloc를 사용 할 경우 초기값은 0부터 시작한다.

    반응형

    댓글

    Designed by JB FACTORY