2015-04-22 90 views
0

我的一個C編程課程的任務是定義一個名爲create_card的函數。這個函數接收一個花色字符和一個卡片值,並返回一個card_t結構體。函數如何創建一個結構體?

問題:函數應該如何創建一個結構?它不能只爲結構創建值嗎?我是否誤解了這個問題的含義,或者是否寫下了錯誤的作業?

+1

會幫助您,如果您發佈代碼 – Sarang

+0

我沒有任何代碼。這是一項任務。他們給你參數遵循,你必須自己設計。 –

+0

你可能已經失去了語言學嗎?該函數不能創建一個類型(嘿,結構是一個類型,所以創建一個結構意味着創建一個類型,對吧?) - 這仍然是程序員必須做的事情,像C這樣的靜態類型語言。它可以創建特定類型的* objects *,這可能就是我們使用的討厭的自然語言中的意思。 –

回答

4

這是返回結構的函數的一個例子。

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

替換struct test與結構的名稱和struct test與你的結構定義中的定義。

如何使用

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

您可以從功能structForceBru's answer,或者你可以創建C dynamic memory一個struct(又名堆),使用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一個malloc -ed指針,當它變得無用。害怕memory leaks,buffer overflowundefined behavior。瞭解更多關於malloc(3) & free

順便說一句,在實踐中,你應該決定誰負責free-內存。在上面的make_foo例子中,make_foo的第二個參數應該是一個文字字符串(如果它是malloc - 例如使用strdup(3),則需要在其他地方使用free,這會變得非常混亂)。

在實踐中,你應該文件有關約定誰負責free一些動態以前malloc ated內存。您可能想要使用valgrind(如果您的系統具有該功能),並且如果使用最近的GCC編譯器,則其-fsanitize=address option可以搜索與內存相關的錯誤。很多時候,您碰巧編寫了製作和銷燬函數(如herehere)。

您可能想要閱讀關於garbage collection(至少了解概念,如reference counting和術語)。也許你稍後想要使用Boehm's conservative garbage collector

+0

不要忘了'免費(fooptr);'當它不再需要時。 – ForceBru

+0

文字字符串是一個常量字節數組,以零字節結尾。數組正在*衰減成指針。 –

+0

爲什麼downvote? –