본문 바로가기

C언어/복습

[C언어]DAY17_동적 메모리 할당(문자열이 여러개인 경우), 구조체 선언

동적 메모리 할당

//문자열이 여러개인 경우 메모리의 동적 할당

//문자열을 다룰 때 null을 저장해야하므로 +1을 고려하여 할당해야 함.

 


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 20

int main(){
	//1. 포인터 선언
	char* p_char =0;
	int i = 0;

	//2. 메모리 할당
	char* a = "welcome";
	char* b = "to";
	char* c= "Neverland";

	//포인터배열
	a = (char*)malloc(sizeof(char)*MAX);
	b = (char*)malloc(sizeof(char)*MAX);
	c = (char*)malloc(sizeof(char)*MAX);
	//a = "hello"; FATAL ERROR! 심각한 에러! malloc한 다음에 free를 하지 않고
	//포인터를 변경하였기 때문에 메모리 반환을 할 수 없음.


	//따라서 a, b, c가 가리키는 메모리영역에 strin을 저장하고 싶은 경우 strcpy를 사용해야한다.
	strcpy(a, "Hello"); //null까지 들어가므로 배열사이즈는 null을 고려해서 크기를 정해야 함. +1
	strcpy(b, "World");
	strcpy(a, "Good Bye")
		;
	char* arr_str[3] = {a, b, c};

	for(i =0; i <3; i++){
		printf("%s ", arr_str[i]);
	}
	printf("\n");

	//3. 메모리 반환
	free(p_char);

}

 


 

//문자열이 여러개인 경우 메모리의 동적 할당 
//문자열을 다룰 때 null을 저장해야 하므로 +1을 고려하여 할당해야 함. 


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

#define MAX 20
int main()
{
	//1. 포인터 선언 ;포인터배열로 선언. 포인터가 여러개이므로 (=스트링이 여러개이므로) 
	//char* arr_str[3]={0,}; //스택에 포인터배열을 만듦 포인터로 구성된배열 
	//char arr_char[3]={0,}; //char로 구성된 배열 
	//char**p_arr_str=arr_str;			//힙영역에 포인터배열을 만듦
	char **p_arr_str=0; 
	int count =0; 
	int i=0;
	//사용자에게 이름을 몇개 입력할 건지 물어본다. 
	printf("입력할 이름의 갯수는 ? \n"); 
	scanf("%d", &count);
	printf("입력한 숫자는:%d입니다. \n", count); 

	//2. 메모리 할당
	//포인터배열을 힙영역에 할당한 것임. char* arr_str[3]={0,}와 동일 (스택영역) 
	//포인터배열은 더블포인터에 담는다. 
	p_arr_str = (char**) malloc(count*sizeof(char*));

	//포인터배열
	//row=3이고 col=20인 2차원 배열을 선언한 것과 똑같은 결과 
	for (i=0; i<count; i++) {
		//sizeof(char) =1 sizeof(arr_str[i]) =4 (포인터의 크기는 4이므로) 
		p_arr_str[i]=(char *)malloc(MAX*sizeof(char));
	}
	//a="Hello"; FATAL ERROR!  : 심각한 에러!. 
	//malloc한 다음에 free를 하지 않고 포인터를 변경하였기 때문에 메모리반환을 할 수 없음. 

	//따라서 a,b, c가 가리키는 메모리영역에 string을 저장하고 싶은 경우 strcpy를 사용해야 한다. 
	//strcpy(arr_str[0], "Hello"); //null까지 들어가므로 배열사이즈는 null을 고려해서 크기를 정해야 함. +1. 
	//strcpy(arr_str[1], "World");
	//strcpy(arr_str[2], "Goodbye"); 
	//scanf_s()를 이용하여 사용자로부터 입력을 받는다. 
	printf("이름을 %d개 입력하세요. \n",count); 
	for (i=0; i<count ; i++){
		scanf_s("%s", p_arr_str[i], MAX*sizeof(char));
	}
	printf("입력한 이름은 다음과 같습니다\n"); 

	for (i=0; i<count ; i++){
		printf("%s\n", p_arr_str[i]);
	}
	//3. 메모리 반환
	for (i=0; i<count ; i++){
		free(p_arr_str[i]);
	}
	free(p_arr_str); 
}

 


구조체 선언 structure type

: 구조체란? 서로 다른 타입의 데이터를 모아서 한번에 처리할 수 있는 형태

 

나만의 데이터타입을 만드는 결과임.

다양한 타입의 변수집합을 하나의 타입으로 다룰 수 있다.

구조체를 구성하는 변수를 구조체의 멤버(member)또는 멤버변수(member variable)이라고 부름.

 

 

1. 구조체정의 방법1

     struct 구조체 이름{

          자료형 변수;

     }; (;로 끝나야함)

 

2. 구조체정의 방법2 : typedef를 이용하여 새로운 타입을 정의

     typedef struct 구조체이름{

          자료형 변수;

     } 새로운 타입(별칭);

 

 


 

#include <stdio.h>
#include <string.h>
#define MAX 100


struct struct_Student {
	//멤버
	int id;
	char name[MAX];
}; //;로 끝내야 함.


typedef struct s_Student{
	//멤버
	int id;
	char name[MAX];

} Student; //새로운 타입(별칭) 정의

int main(){
	//구조체 변수 선언과 초기화
	//1. 형식 : struct 구조체이름 변수;
	struct struct_Student student1 = {1001, "son" };

	//2. 형식 : 별칭 변수;
	Student student2 = {0, };

	printf("%d %d\n", sizeof(student1), sizeof(student2));

	//3. 출력 (멤버변수 접근)
	printf("%d %s\n", student1.id, student1.name );

	//4. 대입. 멤버 변수 접근방법
	student2.id = 1002;
	//name은 배열명, 배열명은 상수, 상수에 상수를 대입못함.
	//student2.name = "lee"; ERROR! // name = 상수
	//student2.name[0] = 'l'; //변수 char
	//student2.name[1] = 'e';
	//student2.name[2] = 'e';
	strcpy(student2.name, "lee");
	printf("%d %s\n", student2.id, student2.name );

}