Возврат структуры из функции (C) - PullRequest
6 голосов
/ 01 февраля 2010

Мне нужно создать структуру внутри функции (динамически с malloc) Тогда я должен иметь возможность отправить его на мой основной и использовать его там. У меня нет проблем с его созданием, мне просто нужна помощь, чтобы отправить его на мою главную, и я также не уверен, как получить к нему доступ, как только получу его там.

struct retValue * fn() {
struct retValue
{
    int number;
};

struct retValue* st = malloc(sizeof(*st));


return(???);   
}

Это код, который у меня есть.

Спасибо за любую помощь. Дайте мне знать, если вам нужно что-то прояснить.

EDIT:

Хорошо. Требуются некоторые пояснения.

То, что я пытаюсь достичь, - это способность передавать структуру через функцию в мою основную. Внутри функции я должен объявить переменные и присвоить им значения. Затем в основном я должен вывести каждую переменную структуры на экран. Нельзя использовать глобальные переменные (и поэтому я предполагаю, что глобальные структуры отсутствуют).

Надеюсь, это проясняет ситуацию.

РЕДАКТИРОВАТЬ 2:

Я понял мою проблему. Для тех, кто заинтересован, мне сначала нужно было создать прототип структуры вне моих функций. Тогда я мог бы передать st и затем получить к нему доступ должным образом. Спасибо всем, и извините за плохую формулировку.

Ответы [ 6 ]

8 голосов
/ 01 февраля 2010
// make the structure def global so that main() and fun() know about it.
struct retValue {
 int number;
};    

// function fn returns a pointer to the structure retValue
struct retValue * fn() {     

 struct retValue* st = malloc(sizeof(*st));

 // return the pointer to the newly allocated structure.
 return(st);   
}

int main() {

 // call fn() to create a new structure dynamically.
 struct retValue *st = fn();
}
4 голосов
/ 01 февраля 2010

Вы получите сотни ответов на этот вопрос.:)

  1. Вы можете вернуть указатель напрямую.Например, return st, ваша основная функция сможет получить доступ к членам структуры, как в st->number.Удостоверьтесь, что указатель free установлен, когда это будет сделано.

  2. Это не обязательно отличный шаблон проектирования.Ваш вызываемый (fn) выделяет память, но ваш вызывающий (основной) должен иметь дело с последствиями.Вы также можете структурировать это с помощью основного распределения памяти (используя malloc или непосредственно в стеке) и передачи указателя для использования fn.Тогда malloc / free происходят в том же месте.В противном случае вы должны быть уверены, что назвали свою функцию fn как-нибудь ясно, например allocateMyStructure, поэтому ясно, что возвращаемый результат необходимо освободить.

PS Я не уверен в правилах определенияструктуры внутри функции, но вы не должны делать это здесь.Объявите struct retValue над main и вашей функцией fn, чтобы они оба могли «видеть» объявленный тип.

1 голос
/ 01 февраля 2010

Я хотел бы отметить одну вещь ... поскольку структура является локальной для функции, существует ли глобальная структура, которая точно соответствует этому, в противном случае вы можете столкнуться с проблемой, как бы main() узнал, что в ней состав? Вы можете уточнить?

Редактировать: Кажется, мой ответ подтвердил то, что я думал.

struct retValue
{
    int number;
};

int main(int argc, char **argv){
   struct retValue *ptr;
   ptr = fn();
   /* do what you have to do... */
   ....
   return 0;
}

struct retValue * fn() {
   struct retValue* st = malloc(sizeof *st);

   /* do you work on the structure */
   st->number = 5;

   return st;   
}

Кстати, кто-то опубликовал это ранее сегодня.

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

0 голосов
/ 01 февраля 2010
struct retValue { int number; };

int main(...) {
  struct retValue *myval;

  myval = fn();
}

struct retValue *fn() {
  struct retValue* st = malloc(sizeof(*st));

  return st;
}
0 голосов
/ 01 февраля 2010

Пожалуйста, объявите структуру в общем заголовочном файле и включите ее в исходный файл, а затем верните st из вашей текущей функции. Это должно работать.

0 голосов
/ 01 февраля 2010

просто: return st;

...