Возвратите структуру из функции (C)

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

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

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


return(???);   
}

Это - код, который я имею до сих пор.

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

Править:

Хорошо Некоторое разъяснение необходимо.

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

Надо надеяться, это разъясняет вещи.

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

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

6
задан Blackbinary 1 February 2010 в 15:26
поделиться

6 ответов

// 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();
}
8
ответ дан 8 December 2019 в 18:36
поделиться

Это можно сделать следующим образом

mylist = ['a', 'b', 'c', 'd', 'e']
myorder = [3, 2, 0, 1, 4]
mylist = [mylist[i] for i in myorder]
print(mylist)         # prints: ['d', 'c', 'a', 'b', 'e']
-121--789206-
>>> import random
>>> x = [1,2,3,4,5]
>>> random.shuffle(x)
>>> x
[5, 2, 4, 3, 1]
-121--789207-

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

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

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

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

4
ответ дан 8 December 2019 в 18:36
поделиться
4144582-

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

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

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;   
}

Кстати кто-то размещен Это ранее сегодня.

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

1
ответ дан 8 December 2019 в 18:36
поделиться

Также: rett st;

0
ответ дан 8 December 2019 в 18:36
поделиться

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

0
ответ дан 8 December 2019 в 18:36
поделиться
struct retValue { int number; };

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

  myval = fn();
}

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

  return st;
}
0
ответ дан 8 December 2019 в 18:36
поделиться
Другие вопросы по тегам:

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