요즘 과제하면서 느끼는게 c언어는 정말 많은 함수들이 있고 나는 모래알만큼 알고 있다는 것이다......공부하자
동적 메모리 할당
원하는 시점에서 원하는 만큼의 메모리를 할당 가능하게 해주는 함수이다. (memory allocation)
포인터 = malloc(크기);
void *malloc(size_t_Size); //함수원형
//성공하면 메모리 주소를 반환, 실패하면 NULL
그렇다면
1. 동적메모리할당은 왜 사용하는 것이며,
2. 포인터에 일반변수의 메모리 주소를 할당하는 것과 차이점은 무엇인가?
2번질문에 대해서 먼저 답하자면,
일반 변수는 스택(stack)에 생성되는 반면에, malloc 함수는 힙부분의 메모리를 사용한다. 스택과 힙의 차이점은 메모리 해제에 있는데, 스택에 생성된 변수는 선언하고 사용하면 되지만, 힙에서 할당된 메모리는 반드시 해제를 해주어야 한다.
free(포인터);
void free(void *_Block); // 함수원형
메모리 해제는 필수이며 메모리를 해제하지 않으면 메모리 사용량이 계속 증가하는 현상인 메모리 누수가 일어난다.
이를 통해 1번에 대한 해답이 나온다.
메모리적인 관점에서 stack은 한정된 공간이고, 힙은 사용자가 할당하는 크기만큼 사용할 수 있기에 stack에 비해 훨씬 그 공간이 크다고 할 수 있다. 또한 동적메모리할당을 이용해 그때그때 필요한 메모리를 요청할 수 있는 것은 메모리를 훨씬 절약하는 방법중 하나라고 할 수 있다.
사실 아직 동적메모리할당이 피부로 와닿지 않기에 여러번 활용해 보면서 어떻게 쓰이는지 활용해야겠다!
활용①
동적메모리할당의 이론을 공부하고 나니 이것을 어떻게 배열로 활용할지 생각해보았다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
int i;
int a[10]={0,1,2,3,4,5,6,7,8,9};
int *numptr;
numptr=(int*)malloc((sizeof(int))*10);
for(i=0;i<10;i++){
*(numptr+i)=a[i];
}
for(i=0;i<10;i++){
printf("%d ", *(numptr+i)); //4i아님
}
free(numptr);
}
일단 해보면서 뼈깊게 깨달은 점은 malloc이 1바이트 단위로 메모리 크기를 지정한다는 것이다. 위 코드와 같이 일일이 배열의 요소를 넣어주는 것은 효율성을 중요시 하는 관점에서 보았을 때 비효율적인 코드인 것 같다.
활용②
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
int i,j,k;
int a[10]={0,1,2,3,4,5,6,7,8,9};
int *numptr;
numptr=(int*)malloc((sizeof(int))*10);
numptr=a;
for(i=0;i<10;i++){
printf("%d ", *(numptr+i));
}
free(numptr);
}
훨씬 낫군... 과제에 유용하게 써먹어봐야지!
calloc, realloc
구글링해보니 이러한 함수도 있더라
포인터 = calloc(갯수, 사이즈);
void* calloc(size_t elt_count, size_t elt_size) // calloc 함수 원형
realloc(포인터, 사이즈);
void* realloc(void* memblock, size_t size); // realloc 함수의 원형
calloc은 언뜻보기에 malloc과 차이가 없어 보인다. 사실 둘은 정말 비슷하지만 calloc은 할당된 공간을 모두 0으로 초기화 하는 반면 malloc은 초기화하지 않는다는 차이점이 있다.
가변길이배열 (Variable Length Array)
: 배열의 크기를 컴파일 타임에 정하지 않고 실행타임에 정할 수 있는 기능..
말이 어렵다! 코드로 확인하자
#include <stdio.h>
int main(){
int input;
scanf("%d", &input);
char array[input];
scanf("%s", array);
printf("%s", array);
}
위의코드에서는 문제없지만 가변길이배열은 함수내에서 쓰일때는 변수lifetime 한계가 있다. 선언된 범위에서만 유효하기 때문이다.
'C > 잡다한 C' 카테고리의 다른 글
scanf, gets, getchar (0) | 2022.04.03 |
---|---|
선택정렬, 버블정렬 (0) | 2022.04.02 |
realloc 함수 주의할 점 (0) | 2022.03.31 |
atoi 함수 (0) | 2022.03.22 |
함수가 메모리의 역할도 할 수 있는것인가...? (0) | 2021.11.03 |