[스키마에듀 수업자료] 동적할당 관련 자료 + 과제
2023. 2. 23. 23:12ㆍ스키마에듀 c언어 수업
728x90











- 동적할당 함수를 만들어라
- 함수이름과 리턴타입 : char * getWord()
- getWord 함수에서는, 단어를 저장한 메모리의 주소를 리턴한다.
- 단어의 최대 길이는 50
- main 함수 안에서 함수를 통해 받은 메모리를 free해줘야 한다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXWORDLEN 50
#define WORDCOUNT 3
int main()
{
int i; char *word;
char *getWord();
for (i = 0; i < WORDCOUNT; i++) {
word = getWord();
printf("%s\n", word);
free(word);
}
return 0;
}
char *getWord()
{
char temp[MAXWORDLEN];
char *str;
scanf("%s", temp);
str = (char *)malloc(strlen(temp) + 1);
strcpy(str, temp);
return str;
}
ReadStringFault1.c
#include <stdio.h>
char * ReadUserName(void){
char name[30];
printf("What's your name?");
gets(name);
return name;
}
int main(void){
char * name1;
char * name2;
name1 = ReadUserName();
printf("name1: %s\n", name1);
name2 = ReadUserName();
printf("name2: %s\n", name2);
return 0;
}
위 코드의 문제점
문자열 배열이 지역적으로 선언되었기 때문에 함수를 빠져나오면서 소멸된다는 데 있다.
그래서 실제로 실행해보면 정상적이지 못한 결과로 이어지는 것을 확인할 수 있다. 간혹 정상적인 결과를 보일 수도 있지만, 이는 우연이며, 결국에 가서는 문제를 일으키고 만다.
#include <stdio.h>
char name[30];
char * ReadUserName(void){
printf("What's your name?");
gets(name);
return name;
}
int main(void){
char * name1;
char * name2;
name1 = ReadUserName();
printf("name1: %s\n", name1);
name2 = ReadUserName();
printf("name2: %s\n", name2);
printf("name1: %s\n", name1);
printf("name2: %s\n", name2);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
//char name[30];
char * ReadUserName(void){
char * name = (char*)malloc(sizeof(char)*30);
printf("What's your name?");
gets(name);
return name;
}
int main(void){
char * name1;
char * name2;
name1 = ReadUserName();
printf("name1: %s\n", name1);
name2 = ReadUserName();
printf("name2: %s\n", name2);
printf("name1: %s\n", name1);
printf("name2: %s\n", name2);
free(name1);
free(name2);
return 0;
}
'스키마에듀 c언어 수업' 카테고리의 다른 글
0311 스키마에듀 백준 3문제 (브론즈 1 + 실버 2) (0) | 2023.03.08 |
---|---|
스키마에듀 0304 수업 백준 3문제 (0) | 2023.03.03 |
스키마에듀 02/25 수업 백준 3문제 (0) | 2023.02.23 |
스키마에듀 수업 _ 0218 part 3 파일 입출력 연습문제 (0) | 2023.02.17 |
스키마에듀 _ 0211 수업준비 (0) | 2023.02.09 |