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
⚠️ **GitHub.com Fallback** ⚠️