我的一個C編程課程的任務是定義一個名爲create_card的函數。這個函數接收一個花色字符和一個卡片值,並返回一個card_t結構體。函數如何創建一個結構體?
問題:函數應該如何創建一個結構?它不能只爲結構創建值嗎?我是否誤解了這個問題的含義,或者是否寫下了錯誤的作業?
我的一個C編程課程的任務是定義一個名爲create_card的函數。這個函數接收一個花色字符和一個卡片值,並返回一個card_t結構體。函數如何創建一個結構體?
問題:函數應該如何創建一個結構?它不能只爲結構創建值嗎?我是否誤解了這個問題的含義,或者是否寫下了錯誤的作業?
這是返回結構的函數的一個例子。
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;
}
這很有道理。感謝ForceBru –
@whitelotus,[我們如何說'謝謝'](http://stackoverflow.com/help/why-vote) – ForceBru
您可以回從功能struct
像ForceBru'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 overflow和undefined behavior。瞭解更多關於malloc(3) & free
。
順便說一句,在實踐中,你應該決定誰負責free
-內存。在上面的make_foo
例子中,make_foo
的第二個參數應該是一個文字字符串(如果它是malloc
- 例如使用strdup(3),則需要在其他地方使用free
,這會變得非常混亂)。
在實踐中,你應該文件有關約定誰負責到free
一些動態以前malloc
ated內存。您可能想要使用valgrind(如果您的系統具有該功能),並且如果使用最近的GCC編譯器,則其-fsanitize=address option可以搜索與內存相關的錯誤。很多時候,您碰巧編寫了製作和銷燬函數(如here或here)。
您可能想要閱讀關於garbage collection(至少了解概念,如reference counting和術語)。也許你稍後想要使用Boehm's conservative garbage collector。
會幫助您,如果您發佈代碼 – Sarang
我沒有任何代碼。這是一項任務。他們給你參數遵循,你必須自己設計。 –
你可能已經失去了語言學嗎?該函數不能創建一個類型(嘿,結構是一個類型,所以創建一個結構意味着創建一個類型,對吧?) - 這仍然是程序員必須做的事情,像C這樣的靜態類型語言。它可以創建特定類型的* objects *,這可能就是我們使用的討厭的自然語言中的意思。 –