Как я возвращаю несколько значений от функции в C?

Если у меня есть функция, которая приводит к результату int и результат string, как я возвращаю их обоих из функции?

Насколько я могу сказать, что могу только возвратить одну вещь, как определено типом, предшествующим имени функции.

80
задан Peter Mortensen 15 March 2013 в 18:58
поделиться

7 ответов

Я не знаю, что представляет собой ваша строка, но я собираюсь предположить, что она управляет своей собственной памятью.

У вас есть два решения:

1: Вернуть struct, который содержит все типы, которые вам нужны.

struct Tuple {
    int a;
    string b;
};

struct Tuple getPair() {
    Tuple r = { 1, getString() };
    return r;
}

void foo() {
    struct Tuple t = getPair();
}

2: Использовать указатели для передачи значений.

void getPair(int* a, string* b) {
    // Check that these are not pointing to NULL
    assert(a);
    assert(b);
    *a = 1;
    *b = getString();
}

void foo() {
    int a, b;
    getPair(&a, &b);
}

Какой из них вы выберете, зависит в основном от личных предпочтений - какая семантика вам больше нравится.

115
ответ дан 24 November 2019 в 09:55
поделиться

Вариант 1 : объявить структуру с целым числом и строкой и вернуть переменную структуры.

struct foo {    
 int bar1;
 char bar2[MAX];
};

struct foo fun() {
 struct foo fooObj;
 ...
 return fooObj;
}

Вариант 2 : вы можете передать один из двух параметров через указатель и внести изменения в фактический параметр через указатель и вернуть другой как обычно:

int fun(char **param) {
 int bar;
 ...
 strcpy(*param,"....");
 return bar;
}

или

 char* fun(int *param) {
 char *str = /* malloc suitably.*/
 ...
 strcpy(str,"....");
 *param = /* some value */
 return str;
}

Вариант 3 : аналогично вариант 2. Вы можете передать как указатель, так и ничего не вернуть из функции:

void fun(char **param1,int *param2) {
 strcpy(*param1,"....");
 *param2 = /* some calculated value */
}
10
ответ дан 24 November 2019 в 09:55
поделиться

Поскольку один из ваших типов результатов является строкой (и вы используете C, а не C ++), я рекомендую передавать указатели в качестве выходных параметров. Используйте:

void foo(int *a, char *s, int size);

и назовите его следующим образом:

int a;
char *s = (char *)malloc(100); /* I never know how much to allocate :) */
foo(&a, s, 100);

В общем, предпочтительнее выполнять распределение в вызывающей функции , а не внутри самой функции, чтобы вы могли быть максимально открыты для различных стратегии распределения.

6
ответ дан 24 November 2019 в 09:55
поделиться

Путем передачи параметров по ссылке в функцию.

Примеры:

 void incInt(int *y)
 {
     (*y)++;  // Increase the value of 'x', in main, by one.
 }

Также с использованием глобальных переменных, но это не рекомендуется.

Пример:

int a=0;

void main(void)
{
    //Anything you want to code.
}
2
ответ дан 24 November 2019 в 09:55
поделиться

Два разных подхода:

  1. Передавайте возвращаемые значения по указателю и изменяйте их внутри функции. Вы объявляете свою функцию как void, но она возвращает значения, переданные в виде указателей.
  2. Определить структуру, которая объединяет возвращаемые значения.

Я думаю, что вариант #1 немного более очевиден, хотя он может стать утомительным, если у вас слишком много возвращаемых значений. В этом случае вариант #2 работает достаточно хорошо, хотя создание специализированных структур для этой цели требует некоторых умственных затрат.

6
ответ дан 24 November 2019 в 09:55
поделиться

Создать структуру и установить два значения внутри и вернуть структурную переменную.

struct result {
    int a;
    char *string;
}

Вы должны выделить место для char * в своей программе.

6
ответ дан 24 November 2019 в 09:55
поделиться

Используйте указатели в качестве параметров функции. Затем используйте их для возврата нескольких значений.

3
ответ дан 24 November 2019 в 09:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: