C언어 함수 정리 참고 문헌 (Ch 61): https://dojang.io/mod/page/view.php?id=527
함수에서 반환값 사용하기 함수에서 반환값을 사용하기 위해서는 함수를 정의할 때 반환값의 자료형을 지정해주고, 함수 안에서 return 키워드로 값을 반환하면 된다.
1 2 3 4 반환값자료형 함수이름() { return 반환값; }
중요한 점: 반환값과 반환값의 자료형이 일치해야한다. 1 2 3 4 5 6 int one () { return 1 ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include <stdio.h> int one () { return 1 ; } int main () { int num1; num1 = one(); printf ("%d\n" , num1); return 0 ; }
int 가 아닌 다른 자료형 반환 예시
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #include <stdio.h> #include <stdbool.h> // bool, true, false가 정의된 헤더 파일 float realNumber () { return 1.234567f ; } bool truth () { return true ; } int main () { float num1; bool b1; num1 = realNumber(); b1 = truth(); printf ("%f\n" , num1); printf ("%d\n" , b1); return 0 ; }
물론 return 값의 자료형을 강제로 변환해주면 이용할 수 있긴 하다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include <stdio.h> int one () { float a = 1.1f ; return (int )a; } int main () { int num1; num1 = one(); printf ("%d\n" , num1); return 0 ; }
또한 함수 반환값의 자료형을 함수를 이용할 때 강제로 바꿔줄 수도 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include <stdio.h> float onePointOne () { return 1.1f ; } int main () { int num1; num1 = (int )onePointOne(); printf ("%d\n" , num1); return 0 ; }
포인터 반환하기 일반적인 자료형을 반환하는 것과 비슷하지만, *를 추가적으로 붙여준다.
1 2 3 4 반환값자료형 *함수이름() { return 반환값; }
예시 (잘못된 코드)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include <stdio.h> int *ten () { int num1 = 10 ; return &num1; } int main () { int *numPtr; numPtr = ten(); printf ("%d\n" , *numPtr); return 0 ; }
지역변수의 주소를 반환하는 경우, 함수에서 이용된 다음 값이 사라지기 때문에 좋은 방법이 아님. 메모리를 할당한 다음, 해당 주소를 반환해야 한다. 예시 (제대로 된 코드)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #include <stdio.h> #include <stdlib.h> // malloc, free 함수가 선언된 헤더 파일 int *ten () { int *numPtr = malloc (sizeof (int )); *numPtr = 10 ; return numPtr; } int main () { int * numPtr; numPtr = ten(); printf ("%d\n" , *numPtr); free (numPtr); return 0 ; }
대신 이용한 다음에는 꼭 할당된 동적 메모리를 해제해주어야한다. 그렇지 않은 경우 메모리 누수가 발생한다. 또 다른 예시 (문자열 반환)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 #include <stdio.h> #include <stdlib.h> // malloc, free 함수가 선언된 헤더 파일 #include <string.h> // strcpy 함수가 선언된 헤더 파일 char *helloLiteral () { char *s1 = "Hello, world!" ; return s1; } char *helloDynamicMemory () { char *s1 = malloc (sizeof (char ) * 20 ); strcpy (s1, "Hello, world!" ); return s1; } int main () { char *s1; char *s2; s1 = helloLiteral(); s2 = helloDynamicMemory(); printf ("%s\n" , s1); printf ("%s\n" , s2); free (s2); return 0 ; }
void 포인터 반환하기 자료형에 상관없이 값을 꺼내오고 싶을 때 이용하는 방법
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 #include <stdio.h> #include <stdlib.h> // malloc, free 함수가 선언된 헤더 파일 #include <string.h> // strcpy 함수가 선언된 헤더 파일 void *allocMemory () { void *ptr = malloc (100 ); return ptr; } int main () { char *s1 = allocMemory(); strcpy (s1, "Hello, world!" ); printf ("%s\n" , s1); free (s1); int *numPtr1 = allocMemory(); numPtr1[0 ] = 10 ; numPtr1[1 ] = 20 ; printf ("%d %d\n" , numPtr1[0 ], numPtr1[1 ]); free (numPtr1); return 0 ; }
구조체와 구조체 포인터 반환하기 함수의 반환값으로 구조체를 이용하는 방법!
1 2 3 4 struct 구조체이름 함수이름(){ return 구조체변수; }
예시
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 #include <stdio.h> #include <string.h> // strcpy 함수가 선언된 헤더 파일 struct Person { char name[20 ]; int age; char address[100 ]; }; struct Person getPerson () { struct Person p ; strcpy (p.name, "홍길동" ); p.age = 30 ; strcpy (p.address, "서울시 용산구 한남동" ); return p; } int main () { struct Person p1 ; p1 = getPerson(); printf ("이름: %s\n" , p1.name); printf ("나이: %d\n" , p1.age); printf ("주소: %s\n" , p1.address); return 0 ; }
구조체 변수를 반환하여 다른 변수에 저장하면, 반횐된 구조체의 내용을 모두 복사하게 되는데, 이는 구조체 크기가 커지면 메모리를 많이 잡아먹게 된다. 따라서 구조체 복사가 일어나지 않도록 malloc 함수로 동적 메모리를 할당한 뒤 구조체 포인터를 반환하는 것이 좋음
1 2 3 4 struct 구조체이름 *함수이름(){ return 구조체포인터; }
예시
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 #include <stdio.h> #include <string.h> // strcpy 함수가 선언된 헤더 파일 #include <stdlib.h> // malloc, free 함수가 선언된 헤더 파일 struct Person { char name[20 ]; int age; char address[100 ]; }; struct Person *allocPerson () { struct Person *p = malloc (sizeof (struct Person )); strcpy (p->name, "홍길동" ); p->age = 30 ; strcpy (p->address, "서울시 용산구 한남동" ); return p; } int main () { struct Person *p1 ; p1 = allocPerson(); printf ("이름: %s\n" , p1->name); printf ("나이: %d\n" , p1->age); printf ("주소: %s\n" , p1->address); free (p1); return 0 ; }
만약 구조체 별칭을 사용하는 경우라면
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 typedef struct _Person { char name[20 ]; int age; char address[100 ]; } Person, *PPerson; PPerson allocPerson () { PPerson p = malloc (sizeof (Person)); strcpy (p->name, "홍길동" ); p->age = 30 ; strcpy (p->address, "서울시 용산구 한남동" ); return p; }