동적할당의 나만의 쉬운 이해?
******************** 글 보시기 전 참고사항 ********************
우선 제 글을 읽어주셔서 감사합니다.
저는 코딩 전문가가 아니라 일개 컴퓨터공학을 전공하며, 컴퓨터 언어를 사랑하는 대학생입니다.
이 블로그는 제가 자주 들여다보고 싶은, 그리고 이렇게 생각하면 편하여서 사람들과 공유하고 싶은
그런 저만의 노하우를 담아놓는 공간입니다.
그렇다보니 전문 지식이 아니라 저의 생각 위주로 글이 게시됩니다.
제가 드리고 싶은 말은 제 글이 정답이 아니기에, 읽으시는 분께서 선별적으로 읽어주셨으면 하는 것입니다.
명확히 문제가 되는 부분, 제가 잘못 알고 있는 부분은 지나치지 마시고
귀찮으시더라도 댓글 한번 달아주시면 감사하겠습니다.
******************************************************************
주 제
동적할당의 나만의 쉬운 이해?
내 용
// 동적할당 자체가 내가 그토록 원했던
// array[b] b는 여기서 정수형 변수임 내가 선언하고싶은..
// 왜 그런경우 있었잖아. 임의의 갯수를 여러개 입력 받아, 특정 메커니즘에 넣고, 거기서 나오는 값을 순서대로 출력하는 경우.
// 임의의 개수를 입력 받을 변수를 어떻게 지정할까 고민 했었잖아. 내가 변수를 일일이 해당 경우에 따라 선언해줄수도 없는 노릇이고,
// 배열을 통해 하자니 그 갯수 이상으로 내가 갯수를 입력 받고자 하면 안되니까.
---> 코딩하면서 흥분해서 작성하는 탓에 횡서리 수서리돼있어서 정리)
동적할당 자체는 메모리를 절약하기 위해서 쓰인다. 동적할당 말고 배열을 이용해서 변수 선언을 하는 것은 배열의 크기를 명확히 지정해주어야한다(array[10]과 같이). 난 예전부터 생각했었다. "배열의 크기를 변수로 지정해주면 정말 편할텐데"
정수형 변수 num1 이 있다치자. 여기에 scanf 를 통해서 사용자로부터 10을 입력받았다. 하지만 코드작성 시, array[num1]을 선언하면 오류가 뜬다. [ ] 안에는 반드시 숫자만 들어가야하는 것이다.
그러면 아사리 array[100]이렇게 크게 공간을 잡아놓자니 메모리 낭비가 너무 심한 것이다.
이 때 쓰이는 아주 좋은 대안! 동적할당 바로 malloc 함수다.
CODE
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int FuncZekob(int *);
void main() {
int makecase;
int * imeueubyunsu;
int i = 0;
printf("원하는 케이스 갯수 입력: ");
scanf("%d", &makecase);
imeueubyunsu = (int *)malloc(sizeof(int)*makecase);
// 임의의변수라는 변수 내에 들어가는 값이 힙영역에서 생성된 공간의 주솟값이다. 임의의변수가 그 공간을 가리키는중이다.
(int *)가 되는 이유! 포인터는 담는 자료형과 담기는 녀석의 자료형이 같아야 된다.
여기서 malloc(sizeof(int)로 공간을 형성해줬지만 이것은 단지 힙 영역에서 생성된 공간일 뿐 어떤 자료형인지는 모른다.
따라서, (int *)로 형변환 해준 것이다.
while(i < makecase){
printf("imeueubyunsu[%d] 값 입력 : ", i);
scanf("%d", (imeueubyunsu + i));
*(imeueubyunsu + i) = FuncZekob((imeueubyunsu + i));
printf("%d\n", *(imeueubyunsu + i));
i++;
}
free(imeueubyunsu);
}
int FuncZekob(int * num1) {
return (*num1) * (*num1);
}