C 함수 반환값 - sonkoni/Koni-Wiki GitHub Wiki
#include <stdio.h>
int one(void) {
return 1;
}
int two(void) {
float a = 2.3f;
return (int)a; // 자료형이 안 맞으면 캐스팅 해서 반환
}
int main(int argc, char *argv[]) {
printf("=> %d\n", one());
printf("=> %d\n", two());
return 0;
}
=> 1
=> 2리퍼런스는 메모리에 할당한 뒤 반환해야 한다. 함수의 지역변수는 함수 스택에 올라가므로, 함수를 빠져나가면 사라진다.
따라서 메모리에 올린 뒤 포인터 주소를 일반 스칼라처럼 복사해서 반환받게 된다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int * hello(int a) {
int *numPtr = malloc(sizeof(int));
*numPtr = a * 10;
return numPtr;
}
char *world(void) {
char *charPtr = malloc(sizeof(char) * 6);
strcpy(charPtr, "WORLD");
return charPtr;
}
int main(int argc, char *argv[]) {
int k = 10;
int *yPtr = hello(k);
char *tPtr = world();
printf("=> %d\n", *yPtr);
printf("=> %s\n", tPtr);
free(yPtr);
free(tPtr);
return 0;
}
// => 100
// => WORLD구조체나 공용체, 열거형도 모두 Value 이다. 그냥 스칼라처럼 직접 반환한다.
#include <stdio.h>
#include <string.h>
struct Person {
char name[20];
int age;
};
struct Person getMan(void) {
struct Person p;
strcpy(p.name, "James");
p.age = 35;
return p;
}
int main(int argc, char *argv[]) {
struct Person k = getMan();
printf("=> %s : %d\n", k.name, k.age);
return 0;
}
// => James : 35문제는 이것이 Value 이기 때문에 구조체 크가기 큰 경우 많은 데이터가 복사된다는 점이다. 이럴 때는 리퍼런스로 반환해라.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Person {
char name[20];
int age;
} Person, *PersonRef;
// 구조체 이름: Person
// 구조체 별칭: Person
// 구조체 포인터 이름: PersonRef
PersonRef getMan(void) {
PersonRef p = malloc(sizeof(Person));
strcpy(p->name, "James");
p->age = 35;
return p;
}
int main(int argc, char *argv[]) {
struct Person *k = getMan(); // 주소를 복사하여 받는다.
printf("=> %s : %d\n", k->name, k->age);
free(k);
return 0;
}
// => James : 35