수색…


비고

C에서 리턴 값을 사용하여 발생하는 오류를 나타내는 것이 일반적입니다. 전달 된 포인터를 사용하여 데이터를 반환 할 수 있습니다. 이것은 여러 가지 이유로 수행 될 수 있습니다. 힙에 메모리를 할당하거나 함수가 호출되는 지점에서 정적 할당을 사용하지 않아도됩니다.

포인터 매개 변수를 사용하여 여러 값 반환

함수에서 여러 값을 반환하는 것을 모방하기 위해 C의 일반적인 패턴은 포인터를 사용하는 것입니다.

#include <stdio.h>

void Get( int* c , double* d )
{
    *c = 72; 
    *d = 175.0;
}

int main(void)
{
    int a = 0;
    double b = 0.0;

    Get( &a , &b );

    printf("a: %d, b: %f\n", a , b ); 

    return 0;
}

배열에 함수 전달

int getListOfFriends(size_t size, int friend_indexes[]) {
  size_t i = 0;
  for (; i < size; i++) {
    friend_indexes[i] = i;
  }
}
C99 C11
/* Type "void" and VLAs ("int friend_indexes[static size]") require C99 at least. 
   In C11 VLAs are optional. */
void getListOfFriends(size_t size, int friend_indexes[static size]) {    
  size_t i = 0;
  for (; i < size; i++) {
    friend_indexes[i] = 1;
  }
}

여기 함수 매개 변수의 [] 안의 static 은 인자 배열이 최소한 (즉, size 요소와 같은) 많은 원소를 가져야한다고 요청합니다. 이 기능을 사용하려면 size 매개 변수가 목록의 배열 매개 변수 앞에 오는 지 확인해야합니다.

getListOfFriends() 과 같이 사용하십시오 :

#define LIST_SIZE (50)

int main(void) {
  size_t size_of_list = LIST_SIZE;
  int friends_indexes[size_of_list];

  getListOfFriends(size_of_list, friend_indexes); /* friend_indexes decays to a pointer to the
                                                     address of its 1st element: 
                                                                      &friend_indexes[0] */

  /* Here friend_indexes carries: {0, 1, 2, ..., 49}; */

  return 0;
}

또한보십시오

다차원 배열을 함수에 전달

매개 변수는 값으로 전달됩니다.

C에서 모든 함수 매개 변수는 값으로 전달되므로 호출 수신자 함수에서 전달 된 것을 수정해도 호출자 함수의 로컬 변수에는 영향을주지 않습니다.

#include <stdio.h>

void modify(int v) {
    printf("modify 1: %d\n", v); /* 0 is printed */
    v = 42;
    printf("modify 2: %d\n", v); /* 42 is printed */
}

int main(void) {
    int v = 0;
    printf("main 1: %d\n", v); /* 0 is printed */
    modify(v);
    printf("main 2: %d\n", v); /* 0 is printed, not 42 */
    return 0;
}

포인터를 사용하여 호출 수신자 함수가 호출자 함수의 로컬 변수를 수정하도록 할 수 있습니다. 이것은 참조로 전달되는 것이 아니라 로컬 변수를 가리키는 포인터 전달 된다는 점에 유의하십시오.

#include <stdio.h>

void modify(int* v) {
    printf("modify 1: %d\n", *v); /* 0 is printed */
    *v = 42;
    printf("modify 2: %d\n", *v); /* 42 is printed */
}

int main(void) {
    int v = 0;
    printf("main 1: %d\n", v); /* 0 is printed */
    modify(&v);
    printf("main 2: %d\n", v); /* 42 is printed */
    return 0;
}

그러나 로컬 변수의 주소를 호출 수신자에게 반환하면 정의되지 않은 동작이 발생합니다. 평생을 넘어 변수에 대한 포인터의 참조 해제를 참조 하십시오.

함수 매개 변수 실행 순서

매개 변수의 실행 순서는 C 프로그래밍에서 정의되지 않습니다. 여기서 왼쪽에서 오른쪽으로 또는 오른쪽에서 왼쪽으로 실행될 수 있습니다. 순서는 구현에 따라 다릅니다.

#include <stdio.h>

void function(int a, int b) 
{
    printf("%d %d\n", a, b);
}

int main(void)
{
    int a = 1;
    function(a++, ++a);
    return 0;
}

오류 코드와 함께 값을 포함하는 구조체를 반환하는 함수의 예

값을 반환하는 함수의 대부분의 예제는 함수가 다음과 비슷한 값을 수정할 수있게하는 인수 중 하나로서 포인터를 제공합니다. 함수의 실제 반환 값은 일반적으로 결과의 상태 (작동 여부와 상관없이)를 나타내는 int 와 같은 유형입니다.

int func (int *pIvalue)
{
    int iRetStatus = 0;             /* Default status is no change */

    if (*pIvalue > 10) {
        *pIvalue = *pIvalue * 45;   /* Modify the value pointed to */
        iRetStatus = 1;             /* indicate value was changed */
    }

    return iRetStatus;              /* Return an error code */
}

그러나 struct 를 반환 값으로 사용하여 다른 상태 값과 함께 오류 상태를 반환 할 수도 있습니다. 예를 들어.

typedef struct {
    int    iStat;      /* Return status */
    int    iValue;     /* Return value */
}  RetValue;

RetValue func (int iValue)
{
    RetValue iRetStatus = {0, iValue};

    if (iValue > 10) {
        iRetStatus.iValue = iValue * 45;
        iRetStatus.iStat = 1;
    }

    return iRetStatus;
}

이 함수는 다음 예제와 같이 사용할 수 있습니다.

int usingFunc (int iValue)
{
    RetValue iRet = func (iValue);

    if (iRet.iStat == 1) {
        /* do things with iRet.iValue, the returned value */
    }
    return 0;
}

또는 다음과 같이 사용할 수 있습니다.

int usingFunc (int iValue)
{
    RetValue iRet;

    if ( (iRet = func (iValue)).iStat == 1 ) {
        /* do things with iRet.iValue, the returned value */
    }
    return 0;
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow