본문 바로가기

IT&코딩/자료구조

자료구조 - 6일차 (동적할당)

728x90
반응형

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

// ---- 포인터와 배열의 관계 ----
// 포인터와 배열은 밀접한 관계를 갖고 있으나, 분명한 차이점이 있다.
// 배열은 선언하게 되면 기본적으로 배열 자기 자신의 시작 주소를 갖고 있다.
// 포인터와 배열은 둘 다 주소를 가지고 연산을 진행하기 때문에 포인터를 배열처럼 인덱스를 통해 접근할 수 있다.
// 배열은 자기 자신의 공간을 사용하고, 포인터는 다른 누군가의 공간을 빌려서 사용한다.

int main()
{
char str[10];
printf("str의 주소 : %p\n", &str);
printf("str의 값 : %p\n", str);

printf("입력 : ");
scanf("%s", str); // &없이 배열의 이름만 작성하는 이유 - 어차피 둘이 같다면 굳이 붙일 이유가 없기 때문이다.

printf("출력 : %s\n", str);

return 0;
}

----------------------------------------------------------------------------------------------------------------------------------

int main()
{
char str1[10] = "Hello";
char* str2 = "Abcde";

printf("str1 : %s\n", str1); // 둘다 주소정보를 전달. %s는 주소를 넘겨받아서 해당 주소로 넘어가서 NULL이 나올 때까지 출력.
printf("str2 : %s\n", str2);

str1[0] = 'B';
// str2[0] = 'Z'; // 바꿀 수 없는 리터럴 상수형식. 리터럴 상수는 값의 변경이 불가능.

printf("str1 : %c%c%c%c%c\n", str1[0], str1[1], str1[2], str1[3], str1[4]);
// printf("str2 : %c%c%c%c%c\n", str2[0], str2[1], str2[2], str2[3], str2[4]);

return 0;
}

----------------------------------------------------------------------------------------------------------------------------------

// ---- 동적 할당 ----


// 프로그램 중간에 메모리 공간의 크기를 지정해서 할당받고, 그 공간을 사용 후, 원하는 시점에 해제하는 방식.
// 메모리 공간을 할당받을 때는 malloc() 함수를 사용해서 할당받을 수 있다. (memory allocation)
// 이때 반드시 stdlib.h 헤더파일을 선언해줘야 한다.
// malloc() 함수의 원형 : 주소를 저장할 변수 = malloc(크기);
// 동적 할당을 통해서 할방받은 메모리 공간은 Heap 영역에 해당한다.
// 동적 할당받은 메모리 공간을 해제할 때는 free(해제할 공간의 주소); 형식으로 해제할 수 있다.
// 한 번의 동적 할당에는 반드시 한 번의 동적 해제가 진행되어야 한다.
// malloc() 함수에서 크기를 넘겨줄 때에는 기본적으로 sizeof() 연산자를 이용해서 넘겨준다.

 

int main()
{
// 저장할 공간의 자료형* 변수명;
// 주소를 저장할 변수 = malloc(크기);
// malloc 함수의 설명을 보고 void* 라는 보이드 포인터라는 자료형이 하나 존재한다고 생각해보자.
int* ptr;
ptr = (int*)malloc(4);

*ptr = 10;
printf("출력 %d\n", *ptr);
// free(해제할 공간의 주소)
free(ptr);

return 0;
}

----------------------------------------------------------------------------------------------------------------------------------

// 다른 예제

int main()
{
int* ptr;

ptr = (int*)malloc(sizeof(int) * 2);

ptr[0] = 10;
ptr[1] = 20;

printf("출력 : %d %d\n", ptr[0], ptr[1]);

free(ptr); // 출력 결과 화면에서는 확인되지 않는다.

return 0;
}

 

----------------------------------------------------------------------------------------------------------------------------------

// 동적 할당 문제

// 사용자에게 영단어를 입력받아 역순으로 출력하세요.
// 단 영단어를 입력받기 전에 입력할 영단어의 길이를 먼저 입력받아 그 길이만큼 공간을 할당하세요.

// ex) 영단어 길이 입력 : 5
//    영단어 입력 : hello
//    영단어 출력 : olleh

int main()
{
int len, i;
char* word;

printf("영단어 길이 입력 : ");
scanf("%d", &len);

word = (char*)malloc(sizeof(char)*len+1); // 널문자까지 고려

printf("영단어 입력 : ");
scanf("%s", word); // 입력값을 저장할 공간의 주소

printf("영단어 출력 : ");

for (i = len - 1; i >= 0; i--)
{
printf("%c", word[i]);
}
printf("\n");
free(word);

return 0;
}

 

728x90
반응형

'IT&코딩 > 자료구조' 카테고리의 다른 글

자료구조 - 8일차 (PUSH & POP)  (0) 2022.09.27
자료구조 - 7일차 (퀴즈)  (0) 2022.09.19
자료구조 - 5일차 (구조체)  (0) 2022.09.15
자료구조 - 4일차 (재귀함수)  (0) 2022.09.15
자료구조 - 3일차 (변수)  (0) 2022.09.12