C언어 - 동적 할당 메모리를 배열처럼 사용하기

2020. 11. 13. 16:58개인공부/C언어

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h> // malloc(), free()

int main() {

	/*
		One variable
	*/

	/*int* ptr = NULL;

	ptr - (int*)malloc(sizeof(int) * 1);
	if (!ptr) exit(1);

	*ptr = 1024 * 3;
	printf("%d\n", *ptr);

	free(ptr);
	ptr = NULL;*/


	/* 1D array*/

	//int n = 3;
	//int* ptr = (int*)malloc(sizeof(int) * n);
	////얼마나 메모리를 동적할당으로 받아와 그 메모리의 첫번째 주소를 ptr에 저장
	//// 힙에 들어가있는 ptr 메모리는 프로그램 끝날때까지 남아있는다.
	//// ptr이라는 변수자체는 지역변수로 함수에서 나가면 메모리에서 빠진다.


	//
	//if (!ptr) exit(1);

	//ptr[0] = 123;
	//// 배열은 블록에서 나가면 메모리에서 제외

	//*(ptr + 1) = 456;
	////int* ptr = (int*)malloc(sizeof(int) * n);
	//// int로 형변환 해서 ptr에 넣어줬기때문에 
	//// *(ptr + 1) = 456; 이런식으로 쓸수있다.

	//*(ptr + 2) = 789;

	//free(ptr);
	//ptr = NULL;

	
	/* 2차원 배열*/
	//int row = 3, col = 2;
	//int(*ptr2d)[2] = (int(*)[2])malloc(sizeof(int) * row * col);
	////int(*ptr2d)[2] = (int(*)[2])malloc(sizeof(int) * row * col); //VLA
	//if (!ptr2d) exit(1);

	//for (int r = 0; r < row; r++)
	//	for (int c = 0; c < col; c++)
	//		ptr2d[r][c] = c + col & r;

	//for (int r = 0; r < row; r++) {
	//	for (int c = 0; c < col; c++)
	//		printf("%d ", ptr2d[r][c]);
	//	printf("\n");
	//}

	// 실용적으로는 1차원배열을 2차원이나 3차원배열처럼 사용하는것.

	/* 1차원을 2차원처럼 사용하기*/

	/*
	row =3, col=2

	(r , c)

	2D
	(0, 0) (0, 1)
	(1, 0) (1, 1)
	(2, 0) (2, 1)

	1D
	(0, 0)  (0, 1)  (1, 0)  (1, 1)  (2, 0) (2, 1)
	0		1		2		3		4		5		= c+ col *r


	//계산식 c+ col *r

	(1, 0) 순서 구하기
	c= 0
	col = 2
	r = 1
	0 + 2*1 = 3
	고로 3번째.
	*/
	
	int row = 3, col = 2;
	int* ptr = (int*)malloc(row * col * sizeof(int));
	if (!ptr) exit(1);

	for (int r = 0; r < row; r++)
		for (int c = 0; c < col; c++)
			ptr[c + col * r] = c + col * r;

	for (int r = 0; r < row; r++)
	{
		for (int c = 0; c < col; c++)
			printf("%d ", *(ptr + c + col * r));
		printf("\n");
	}
	//결과값
	/*
		0 1
		2 3
		4 5
	*/

	/*
		1차원 배열 3차원처럼 쓰기
		row =3, col = 2, depth = 2 // 2차원 array가 2개있다(depth 2)
	
		(r, c, d)

		3D
		----------------
		(0,0,0) (0,1,0)
		(1,0,0) (1,1,0)
		(2,0,0) (2,1,0)
		----------------
		(0,0,1) (0,1,1)
		(1,0,1) (1,1,1)
		(2,0,1) (2,1,1)
		----------------
		
		1d
		(0,0,0) (0,1,0) (1,0,0) (1,1,0) (2,0,0) (2,1,0) (0,0,1) (0,1,1) (1,0,1) (1,1,1) (2,0,1) (2,1,1)
		0		1		2		3		4		5		6		7		8		9		10		11				

		= c + col * r + (col * row) * d

		(1, 1, 1) 구하기
		= 1 + 2 * 1 + (3*2) * 1 = 1 + 2 + 6 = 9

	*/

	return 0;
}

 

 

 

출처 : 홍정모의 따라배우는 C언어