본문 바로가기

C언어/예습

[C언어 예습]DAY16_동적 할당, 동적 배열

동적할당(dynamic allocation)

malloc()
     자료형* 포인터명 = (자료형*)malloc(sizeof(자료형)*크기);
     자료형* 포인터명 = (자료형*)malloc(크기);

 

동적할당 초기화(clear allocation)

calloc()
     자료형* 포인터명 = (자료형*)calloc(크기, sizeof(자료형));

동적할당 크기변경(resize allocation)

realloc()
     자료형* 포인터명1 = (자료형*)malloc(sizeof(자료형)*크기);
     자료형* 포인터명2 = (자료형*)realloc(포인터명1, sizeof(자료형)*변경할크기);

동적할당 메모리 해제(중요)

     free(포인터명);

          * 메모리를 해제하지 않으면 사라지지 않고 남아있기 때문에 overflow가 생기면 심각한 오류가 발생한다.
            꼭 free함수로 메모리 해제를 해줘야 한다.


#include <stdio.h>
#include <stdlib.h>

void main() {
	int* mAr = 0;

	mAr = (int*)malloc(sizeof(int) * 5);
	mAr = (int*)calloc(5, sizeof(int));
	mAr = (int*)realloc(mAr, sizeof(int)*10);

	for (int i =0 ; i < 10; i++) {
		mAr[i] = i + 1;
	}

	for (int i =0 ; i < 10; i++) {
		printf("%d ", mAr[i]);
	}
	printf("\n");
	free(mAr);
}

 


동적배열

동적배열 사용
     포인터명[index]
     *(포인터명+i)

 


#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
//입력한 정수들을 오름차순으로 정렬하기
//선택정렬 함수를 사용, call by address
//void 타입으로 선언
//정렬하기\n1. 오름차순\n 2. 내림차순\n 3. 나가기\n

void sortAsc(int* ar, int length);
void sortDsc(int* ar, int length);

void main() {
	int* arNum = 0;
	int size = 0;
	int choice = 0;
	char* dot[] = { ".", "..", "..." };
	char* loading[] = { "□□□□□□□□□","■■■□□□□□□", "■■■■■■■□□" };

	for (; 1;) {

		printf("입력하실 정수의 갯수를 입력하세요(나가기: -99)\n");
		scanf_s("%d", &size);
		if (size == -99) break;

		arNum = (int*)calloc(size, sizeof(int));
		printf("입력하신 갯수만큼 정수를 입력하세요\n");
		for (int i = 0; i < size; i++) {
			scanf_s("%d", arNum + i);
		}

		system("cls");

		for (int i = 0; i < size; i++) {
			printf("%d ", arNum[i]);
		}

	again:;
		printf("\n1. 오름차순\n2. 내림차순\n3. 나가기\n");
		scanf_s("%d", &choice);
		if (choice == 3) break;
		switch (choice) {
		case 1:
			sortAsc(arNum, size);
			printf("\n");
			break;
		case 2:
			sortDsc(arNum, size);
			printf("\n");
			break;
		default:
			printf("잘못 입력하셨습니다. 다시 시도하세요");
			goto again;
		}
		system("cls");
		for (int i = 0; i < 3; i++) {
			printf("%s\n", loading[i]);
			printf("     정렬중%s", dot[i]);
			Sleep(1000);
			system("cls");
		}
		for (int i = 0; i < size; i++) {
			printf("%d ", arNum[i]);
			Sleep(500);
		}
		printf("\n");
		free(arNum);
	}
}


void sortAsc(int* ar, int length) {
	for (int i = 0; i < length-1; i++) {
		for(int j =i+1; j < length; j++){
			if (ar[i] > ar[j]) {
				int temp = ar[i];
				ar[i] = ar[j];
				ar[j] = temp;
			}
		}
	}
}

void sortDsc(int* ar, int length) {
	for (int i = 0; i < length - 1; i++) {
		for (int j = i + 1; j < length; j++) {
			if (ar[i] < ar[j]) {
				int temp = ar[i];
				ar[i] = ar[j];
				ar[j] = temp;
			}
		}
	}
}

 



int arr[] = {0, };
*정적배열은 []안에 상수만 가능. 그래서 index입력받는거 X