#include<stdio.h> #include<stdlib.h> // malloc, free 함수가 선언된 헤더 파일 #include<string.h> // strcpy 함수가 선언된 헤더 파일
void *allocMemory()// void 포인터를 반환하는 allocMemory 함수 정의 { void *ptr = malloc(100); // 100바이트만큼 동적 메모리 할당
return ptr; // void 포인터 반환 } /* 코드 줄이는 방법 void *allocMemory() { return malloc(100); // malloc 함수를 호출하면서 바로 반환 } */
intmain() { char *s1 = allocMemory(); // void 포인터를 char 포인터에 넣어서 문자열처럼 사용 strcpy(s1, "Hello, world!"); // s1에 Hello, world! 복사 printf("%s\n", s1); // Hello, world! free(s1); // 동적 메모리 해제
int *numPtr1 = allocMemory(); // void 포인터를 int 포인터에 넣어서 정수 배열처럼 사용 numPtr1[0] = 10; // 첫 번째 요소에 10 저장 numPtr1[1] = 20; // 두 번째 요소에 20 저장 printf("%d %d\n", numPtr1[0], numPtr1[1]); // 10 20 free(numPtr1); // 동적 메모리 해제
switch (skill) { case LightBinding: // 열거형 값이 LightBinding일 때 printf("LightBinding\n"); break; case PrismaticBarrier: // 열거형 값이 PrismaticBarrier일 때 printf("PrismaticBarrier\n"); break; case LucentSingularity: // 열거형 값이 LucentSingularity일 때 printf("LucentSingularity\n"); break; case FinalSpark: // 열거형 값이 FinalSpark일 때 printf("FinalSpark\n"); break; default: break; }
#include<stdio.h> #include<stdlib.h> // malloc, free 함수가 선언된 헤더 파일
structPoint2D { int x; int y; };
intmain() { structPoint2D *p[3];// 크기가 3인 구조체 포인터 배열 선언
// 구조체 포인터 배열 전체 크기에서 요소(구조체 포인터)의 크기로 나눠서 요소 개수를 구함 for (int i = 0; i < sizeof(p) / sizeof(struct Point2D *); i++) // 요소 개수만큼 반복 { p[i] = malloc(sizeof(struct Point2D)); // 각 요소에 구조체 크기만큼 메모리 할당 }
p2.x = 10; // p1의 멤버에만 값 저장 p2.y = 20; // p1의 멤버에만 값 저장
memcpy(&p1, &p2, sizeof(struct Point1D)); // Point2D 구조체 크기만큼 p2의 내용을 p1로 복사 printf("%d \n", p1.x); // 10: p2의 내용을 p1로 복사, 한 칸만 복사했으므로 10
memcpy(&p3, &p2, sizeof(struct Point3D)); // Point2D 구조체 크기만큼 p2의 내용을 p3로 복사 printf("%d %d %d\n", p3.x, p3.y, p3.z); // 10 20 10: p2의 내용을 p3로 복사 3칸을 복사했는데, 부족한지 맨 첫 값이 다시 나옴 // 그 외에도 메모리 사이즈가 작은 데이터를 큰 데이터로 옮기는 경우, 해당하는 범위를 넘어서면 원래 값이 남아있다. return0; }
#include<stdio.h> #include<string.h> // strcpy 함수가 선언된 헤더 파일 #include<stdlib.h> // malloc, free 함수가 선언된 헤더 파일
typedefstruct _Person {// 구조체 이름은 _Person char name[20]; // 구조체 멤버 1 int age; // 구조체 멤버 2 char address[100]; // 구조체 멤버 3 } Person; // typedef를 사용하여 구조체 별칭을 Person으로 정의
intmain() { Person *p1 = malloc(sizeof(Person)); // 구조체 별칭으로 포인터 선언, 메모리 할당
#include<stdio.h> #include<string.h> // strcpy 함수가 선언된 헤더 파일
typedefstruct _Person {// 구조체 이름은 _Person char name[20]; // 구조체 멤버 1 int age; // 구조체 멤버 2 char address[100]; // 구조체 멤버 3 } Person; // typedef를 사용하여 구조체 별칭을 Person으로 정의
#include<stdio.h> #include<string.h> // strcpy 함수가 선언된 헤더 파일
typedefstruct {// 구조체 이름이 없는 익명 구조체 char name[20]; // 구조체 멤버 1 int age; // 구조체 멤버 2 char address[100]; // 구조체 멤버 3 } Person; // typedef를 사용하여 구조체 별칭을 Person으로 정의
크기가 고정된 배열을 사용 => 크기가 변할 수 있는 배열을 어떻게 선언할 수 있는지에 대한 고민에서 출발하는 일!
C언어에서 배열을 선언: 고정 크기의 배열 선언
1 2
int numArr[10] // 10 : 고정크기 => 10개의 요소를 가지는 배열
직관적으로 가변 길이 배열 선언해보기
1 2 3 4 5 6 7 8 9 10 11 12 13
#define _CRT_SECURE_NO_WARNING #include<stdio.h>
intmain() { intsize;
scanf("%d", &size); // 배열의 크기를 입력받음
int numArr[size]; // GCC에서는 사용 가능, Visual Studio 2015에서는 컴파일 에러
return0; }
컴파일러마다 다르지만, VS2015의 경우 컴파일 에러가 발생한다고 한다 => 동적으로 지정하기 위해서는 포인터를 선언하고, 메모리를 할당한 뒤 메모리를 배열처렁 사용해야한다!
포인터에 할당된 메모리를 배열처럼 사용하기
포인터를 배열처럼 사용하는 방법: 포인터에 malloc 함수로 메모리를 할당하여 사용하기! malloc: dynamic memory allocation 방법. 메모리를 필요할 때 할당하여 사용, 다 쓴 메모리는 free를 통해 반드시 해제해줘야함! malloc을 이용하기 위해서는 stdlib을 추가해줘야한다!
#include<stdio.h> #include<stdlib.h> // malloc, free 함수가 선언된 헤더 파일
intmain() { int row, col;
scanf("%d %d", &row, &col);
// 2차원 배열 선언 시작 int **m = malloc(sizeof(int *) * row); // 이중 포인터에 (int 포인터 크기 * row)만큼 // 동적 메모리 할당. 배열의 행
for (int i = 0; i < row; i++) // 세로 크기만큼 반복 { m[i] = malloc(sizeof(int) * col); // (int의 크기 * col)만큼 동적 메모리 할당. 배열의 열 } // 2차원 배열 선언 끝
// 2차원 배열에 값 할당 시작 for (int i = 0; i < row; i++) // 행 크기만큼 반복 { for (int j = 0; j < col; j++) // 열 크기만큼 반복 { m[i][j] = i + j; // 2차원 배열의 각 요소에 i + j 값을 할당 } } // 2차원 배열에 값 할당 끝
for (int i = 0; i < row; i++) // 행 크기만큼 반복 { for (int j = 0; j < col; j++) // 열 크기만큼 반복 { printf("%d ", m[i][j]); // 2차원 배열의 인덱스에 반복문의 변수 i, j를 지정 } printf("\n"); // 가로 요소를 출력한 뒤 다음 줄로 넘어감 }
// 2차원 배열 메모리 해제 시작 for (int i = 0; i < row; i++) // 행 크기만큼 반복 { free(m[i]); // 2차원 배열의 열 공간 메모리 해제 }
free(m); // 2차원 배열의 행 공간 메모리 해제 // 2차원 배열 메모리 해제 끝