구조체, 포인터, 동적할당 문제
2022. 8. 12. 21:38ㆍC언어
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
'C언어' 카테고리의 다른 글
배열과 포인터의 관계 (0) | 2022.05.23 |
---|---|
내가 헷갈리는 포인터 파트 정리! (0) | 2022.05.23 |
c언어 - 테트리스 만들기 초기 설정,4 블럭 낙하 (0) | 2022.02.12 |
c언어-테트리스만들기3, 테트리스 블럭만들기, 다차원배열 (0) | 2022.02.09 |
c언어 -테트리스 만들기2 위치 지정하기, 키보드로 움직이기 (0) | 2022.01.28 |