#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct profile{
char name[20];
int age;
double height;
char *intro;
};
int main(void){
struct profile yuni;
strcpy(yuni.name, "hayun");
yuni.age = 17;
yuni.height = 164.7;
yuni.intro = (char * )malloc(80);
printf("introduce : ");
gets(yuni.intro);
printf("name ; %s\n", yuni.name);
printf("age : %d\n", yuni.age);
printf("height : %.1lf\n", yuni.height);
printf("intro : %s\n", yuni.intro);
return 0;
}
### 구조체 정의 및 초기화
- `struct profile`은 `name`(이름), `age`(나이), `height`(키), 그리고 `intro`(자기소개)라는 네 개의 멤버 변수를 가지고 있습니다. `name`, `age`, `height`는 각각 문자 배열, 정수, 실수 타입으로 선언되어 있으며, `intro`는 동적 메모리 할당을 위한 문자 포인터입니다.
- `struct profile yuni;`는 `profile` 구조체 타입의 변수 `yuni`를 선언합니다.
- `strcpy(yuni.name, "hayun");`, `yuni.age = 17;`, `yuni.height = 164.7;`을 통해 `yuni`의 각 필드에 이름, 나이, 키를 초기화합니다.
### 동적 메모리 할당 및 사용자 입력
- `yuni.intro = (char *)malloc(80);`를 통해 `yuni`의 자기소개를 위한 문자열을 저장할 메모리 공간을 동적으로 할당합니다.
- `gets(yuni.intro);`는 사용자로부터 자기소개 문자열을 입력받아 `yuni.intro`가 가리키는 메모리 공간에 저장합니다. **주의**: `gets()` 함수는 보안에 취약하고, 버퍼 오버플로우를 발생시킬 수 있으므로 사용을 피해야 합니다. `fgets()` 함수로 대체하는 것이 안전합니다.
### 출력
- `printf` 함수를 사용하여 `yuni`의 이름, 나이, 키, 자기소개를 출력합니다.
### 메모리 해제
- 코드에서는 메모리 해제 부분이 빠져있습니다. 프로그램 종료 전에 `free(yuni.intro);`를 호출하여 동적으로 할당된 메모리를 해제해야 합니다. 동적으로 할당된 메모리는 사용이 끝난 후 반드시 해제해야 합니다.
### 개선된 코드 예시
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct profile{
char name[20];
int age;
double height;
char *intro;
};
int main(void){
struct profile yuni;
strcpy(yuni.name, "hayun");
yuni.age = 17;
yuni.height = 164.7;
yuni.intro = (char *)malloc(80);
if(yuni.intro == NULL){
printf("Memory allocation failed.\n");
exit(1);
}
printf("introduce : ");
fgets(yuni.intro, 80, stdin); // gets() 대신 안전한 fgets() 사용
printf("name ; %s\n", yuni.name);
printf("age : %d\n", yuni.age);
printf("height : %.1lf\n", yuni.height);
printf("intro : %s\n", yuni.intro);
free(yuni.intro); // 동적으로 할당된 메모리 해제
return 0;
}
이 버전에서는 `gets()` 대신 `fgets()`를 사용하여 보안 문제를 해결했으며, `free(yuni.intro);`를 추가하여 메모리 누수를 방지했습니다.
'개념 > 혼자 공부하는 C언어' 카테고리의 다른 글
chapter 17) 자기 참조 구조체로 list 만들기 (0) | 2024.10.03 |
---|---|
chapter 17) 열거형을 사용한 프로그램 (1) | 2024.10.02 |
chapter 17) 명령형 인수를 출력하는 프로그램 (0) | 2024.09.30 |
chapter 17) 다른 구조체를 멤버로 갖는 구조체 사용 (0) | 2024.09.29 |
chapter 17) 구조체를 변환하여 두 변수의 값 교환 (1) | 2024.09.28 |