2015-04-22 2 views
0

Одним из моих назначений для курса программирования C было определение функции, называемой create_card. Эта функция получает символ костюма и значение карты и возвращает структуру card_t.Как функция может создать структуру?

Вопрос: Как функция должна создавать структуру? Не может ли он создавать значения для структуры? Разве я неправильно истолковал смысл вопроса или было неправильно записано задание?

+1

поможет, если вы отправите код – Sarang

+0

У меня нет кода. Это задание. Они дают вам параметры для подражания, и вы должны сами его спроектировать. –

+0

Возможно, вы потерялись в лингвистике? Функция не может создать тип (и hey, struct - это тип, поэтому создание структуры означает создание типа, правильно?) - это все еще что-то, что программист должен делать, в статически типизированных языках, таких как C. Он может создавать * объекты * определенных типов, хотя это, вероятно, имеет значение этого в назойливом естественном языке, который мы используем. –

ответ

4

Это пример функции, возвращающей структуру.

struct test { 
    int a; 
}; 
struct test Fun(int k) { 
    struct test d; 
    d.a=k; 
    return d; 
} 

Заменить struct test с именем вашей структуры и определения struct test с определением вашего STRUCT в.

Как использовать

int main() { 
    struct test Test=Fun(6); 
    printf("%d",Test.a); // prints '6' 
    return 0; 
} 
+0

Это имеет смысл. Спасибо ForceBru –

+0

@whitelotus, [как мы говорим «Спасибо» здесь] (http://stackoverflow.com/help/why-vote) – ForceBru

-1

Вы можете возвращениеstruct из функции, как в ForceBru's answer, или вы можете создатьstruct в C dynamic memory (он же в куче), используя malloc и возврата указатель на него, например

struct foo_st { 
    int num; 
    const char* str; 
}; 

struct foo_st* 
/* the second argument s should practically be a literal string */ 
make_foo (int n, const char* s) { 
    struct foo_st* p = malloc(sizeof(struct foo_st)); 
    if (!p) { perror("malloc foo"); exit(EXIT_FAILURE); }; 
    p->num = n; 
    p->str = s; 
    return p; 
} 

Ваш main (или какой-либо другой функции) может впоследствии сделать struct foo_st*fooptr = make_foo(32, "abc");, но кто-то должен вызывать free(fooptr) (или, по крайней мере, free адрес, который был внутри fooptr).

Конечно, вы не должны забывать free a malloc-указатель, когда он становится бесполезным. Бойтесь memory leaks, buffer overflow и undefined behavior. Узнайте больше о malloc(3) & free.

BTW, на практике вам следует решить, кто несет ответственность за free-память. В приведенном выше примере make_foo предполагается, что второй параметр - make_foo - это буквальная строка (если она равна malloc, например, с использованием strdup(3), вам нужно будет free в другом месте, и это становится очень грязным).

На практике вы должны документ конвенции о , который отвечает к free некоторые динамически ранее malloc ованные памяти. Возможно, вы захотите использовать valgrind (если ваша система имеет его), и, если использовать недавний компилятор GCC, его -fsanitize=address option для поиска ошибок, связанных с памятью. Очень часто вы выполняете код как для создания, так и для уничтожения функций (например, here или here).

Возможно, вы захотите прочитать о garbage collection (по крайней мере, чтобы понять концепции, такие как reference counting и терминология). Возможно, позже вы захотите использовать Boehm's conservative garbage collector.

+0

Не забудьте «free (fooptr)», когда он больше не нужен. – ForceBru

+0

Литеральная строка - это постоянный массив байтов, завершаемый нулевым байтом. Массивы * разлагаются * в указатели. –

+0

Почему downvote? –

Смежные вопросы