헤더파일
<mallloc.h> // 동적할당에 관한 함수가 정의된 헤더파일
#include <stdlib.h> // -> malloc.h가 포함된 헤더파일
예시코드(1)
#include<stdio.h>
#include <stdlib.h>
int main()
{
// malloc
//동적할당 생성 함수
// 자료형 * 포인터명 = malloc(sizeof(자료형)*개수)
// void *malloc(size_t size);
//반환값이 void pointer. 간접참조 연산자를 통해 주소에 해당하는 값을 보내줄 수 없다. 그냥 주소값이라고 보면 된다.
//매개변수 size_t 할당받을 공간의 크기. sizeof -> 공간의 크기 계산. sizeof-> 반환값이 정수
//배열로써 할당을 받을거면 개수를 적어줘야 할텐데, 배열에서 적는 갯수는 다르다.
//배열은 반드시 양의정수 상수값만 적고 여기서는 필요한 값만큼 변수 지정해서 넣어준다.
int *pt = (int *)malloc(sizeof(int)); // 반환 타입이 안맞으면 c++에서는 에러 출력
//void pointer 란건 주소값만 표현한다. %p -> pointer의 주소를 출력
*pt = 30;
printf("%p\n", pt);
printf("%d\n", *pt);
// 할당받을 공간의 크기 -> int 형이 들어갔다
// struct info{ char name[10]. int age;}; -> 16byte가 들어가.
//할당한 크기를 받을 포인터변수 변수가 필요
free(pt); //할당 해제할 공간의 주소값을 넣어달라
//free
//동적할당 해제
return 0;
}
문제 풀이
간단한 문제 설명 문제 : 전체 방의 갯수를 입력 받고 그 중 짝수 번째 방을 출력한다.
내 코드
#include<stdio.h>
#include <stdlib.h>
int main(void) {
int cnt, num;
int n = 0;
printf("크기 입력 : ");
scanf_s("%d", &cnt, sizeof(int));
int *pt = (int *)malloc(sizeof(int) *n);
for (int i = 0; i < cnt; i++) {
printf("숫자 입력 : ");
scanf_s("%d", &num);
pt[i] = num;
if (num % 2 == 0) {
printf("%d 번방 = %d\n", i, num);
}
}
free(pt);//할당 해제할 공간의 주소값을 넣어달라
return 0;
}
선생님 코드
#include<stdio.h>
#include <stdlib.h>
int main(void) {
int su;
printf("크기 입력 : ");
scanf_s("%d", &su);
int * pt = (int *)malloc(sizeof(int) * su);
for (int i = 0; i < su; i++) {
printf(" 숫자 입력 : ");
scanf_s("%d", pt + i);
}
printf("\n\n짝수\n");
for (int i = 0; i < su; i++) {
if (pt[i] % 2 == 0) {
printf("%d번방 : % d\n", i, pt[i]);
}
}
free(pt);
return 0;
}
정리
pt + i로 scanf_s를 받으면 편하다. 어차피 scanf도 주소값으로 입력을 받으니까. 포인터를 갖다쓰면 되지.
참고자료
kg아이티뱅크학원 (자료구조 수업)