[스키마에듀 수업자료] 동적할당 관련 자료 + 과제

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;
}