구조체, 포인터, 동적할당 문제

2022. 8. 12. 21:38C언어

728x90

주석처리되있는 문장을 코드로 표현하면 된다.

 

푸는 방식 : 먼저 전체적인 그림으로 상황을 파악한다.

 

1번

#include <stdio.h>
#include <stdlib.h>
typedef struct {
	int data1;
	int data2;
}Data1;

void Func1(Data1** p) {
	(**p).data1 = 100;
	// (*p)->data1 = 100;
	return (*p)->data1;
}


void Func2(Data1* p) {
	p->data2 = 200;
	return p->data2;
}

int main()
{
	
	Data1* p = (Data1*)malloc(sizeof(Data1));
	
	
	Func1(&p);
	//Func1()함수를 만들어서 Func1()안에서 data1에 100을 넣으세요.
	Func2(p);
	//Func2()함수를 만들어서 Func2()안에서 data2에 200을 넣으세요.	

	printf("%d %d\n", p->data1, p->data2);
	//data1과 data2를 출력하세요.

	free(p);
	// 동적해제 코드를 추가하세요.

	return 0;
}

 

2번

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

typedef struct {
	char name[20];
	int score;
}Element;

typedef struct {
	int data1;
	int data2;
	Element p;
}Data1;

int main()
{
	Data1* p = (Data1*)malloc(sizeof(Data1));

	printf("이름을 입력하세요 : ");
	scanf("%s", (p->p.name));
	//scanf()를 이용해 name에 이름을 입력 받으세요.
	
	printf("점수를 입력하세요 : ");
	scanf(" %d", &(p->p.score));
	//scanf()를 이용해 score에 점수를 입력 받으세요.
	printf("%s %d", p->p.name, p->p.score);
	//입력받은 값을 출력하세요.

	//동적 해제 코드를 추가하세요.
    free(p);

	return 0;
}

 

배열의 경우에는 이름 자체에 주소가 있다.

scanf("%s",(*p).p.name); 로도 표현 가능

 

scanf("%d",&((*p).p.score)); 로도 표현가능

 

 

3번

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

typedef struct {
	char name[20];
	int score;
}Element;

typedef struct {
	int data1;
	int data2;
	Element* p;
}Data1;

int main()
{
	Data1* p = (Data1*)malloc(sizeof(Data1));
	
	p->p = (Element*)malloc(sizeof(Element));

	printf("이름을 입력하세요 : ");
	scanf("%s", (*(p->p)).name);
	//scanf()를 이용해 name에 이름을 입력 받으세요.
	printf("점수를 입력하세요 : ");
	scanf(" %d", &((*(p->p)).score));
	//scanf()를 이용해 score에 점수를 입력 받으세요.
	printf("%s %d", (*(p->p)).name, ((*(p->p)).score));
	//입력받은 값을 출력하세요.
	free(p->p);
    	free(p);
	//동적 해제 코드를 추가하세요.

	return 0;
}

name과 score에 접근하기 위해서는 Element 구조체에 접근해야한다.

Element 구조체에 접근하기 위해서는 동적할당이 필요하다. 

 

scanf("%s",p->p->name); 도 가능하다.

scanf("%d",&p->p->score); 도 가능하다.

 

주의 !! 동적해제 할 때 안쪽에 있는 것 먼저 해제하고, 그 다음 안쪽 공간을 해제해야한다.

 

 

4.

 

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

typedef struct {
	char* name;
	int score;
}Element;

typedef struct {
	int data1;
	int data2;
	Element* p;
}Data1;

int main()
{
	Data1* p = (Data1*)malloc(sizeof(Data1));
	p->p = (Element*)malloc(sizeof(Element));
	p->p->name = (char*)malloc(sizeof(char[20]));

	printf("이름을 입력하세요 : ");
	scanf("%s", p->p->name);
	//scanf()를 이용해 name에 이름을 입력 받으세요.
	printf("점수를 입력하세요 : ");
	scanf("%d", &p->p->score);
	//scanf()를 이용해 score에 점수를 입력 받으세요.
	printf("%s %d", *(p->p->name), p->p->score);
	//입력받은 값을 출력하세요.
	
	free(p->p->name);
	free(p->p);
	free(p);
	//동적 해제 코드를 추가하세요.

	return 0;
}

이는 내 틀린 풀이이다.

 

char* name에 이름을 저장할 수 없다. 따라서, 동적할당을 받아야한다.

p->p->name = (char*)malloc(sizeof(char[20]); 이 아니라, 

p->p->name = (char*)malloc(sizeof(char) * 20)으로 표현 할 수 있다.

 

 

%s 는 주소를 넘겨받고 하나씩 출력하는 역할을 한다.. 따라서, 

printf("%s %d\n", p->p->name, p->p->score); 로 표현되어야 한다.

 

따라서, 아래 코드가 옳다.

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

typedef struct {
	char* name;
	int score;
}Element;

typedef struct {
	int data1;
	int data2;
	Element* p;
}Data1;

int main()
{
	Data1* p = (Data1*)malloc(sizeof(Data1));
	p->p = (Element*)malloc(sizeof(Element));
	p->p->name = (char*)malloc(sizeof(char) * 20);

	printf("이름을 입력하세요 : ");
	scanf("%s", p->p->name);
	//scanf()를 이용해 name에 이름을 입력 받으세요.
	printf("점수를 입력하세요 : ");
	scanf("%d", &p->p->score);
	//scanf()를 이용해 score에 점수를 입력 받으세요.
	printf("%s %d\n", p->p->name, p->p->score);
	//입력받은 값을 출력하세요.
	
	free(p->p->name);
	free(p->p);
	free(p);
	//동적 해제 코드를 추가하세요.

	return 0;
}

 

 

 

5.

 

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

typedef struct {
	int data3;
	int data4;
}Data2;

typedef struct {
	int data1;
	int data2;
	Data2* p;
}Data1;

void Func3(Data);
void Func2(Data2*);

void Func3(Data1*** p) {
	(**p)->p->data4 = 200;
}

void Func2(Data2* p)
{
	p->data3 = 100;
}

void Func1(Data1** p)
{
	Data2* p2 = (Data2*)malloc(sizeof(Data2));
	(*p)->p = p2;

	Func2((*p)->p);
	//Func2()함수를 만들어서 Func2()안에서 data3에 100을 넣으세요. 
	Func3(&p);
	//Func3()함수를 만들어서 Func3()안에서 data4에 200을 넣으세요.
}

int main()
{
	Data1* p = (Data1*)malloc(sizeof(Data1));

	Func1(&p);

	//data3와 data4를 출력하세요.
	printf("%d %d\n", p->p->data3, p->p->data4);

	free(p->p);
	free(p);

	return 0;
}

그림으로 표현하면 아래와 같다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90