函数如何创建结构?

我对C编程课程的一个任务是定义一个名为create_card的函数。 此函数接收套装字符和卡值,并返回card_t结构。

问题:函数如何创建结构? 它不能只为结构创建值吗? 我是否曲解了问题的含义,还是错误地写下了作业?

这是返回结构的函数的示例。

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

使用struct test的定义将struct test替换为struct test的名称和struct test的定义。

如何使用

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

您可以从ForceBru的答案中的函数返回 struct ,也可以使用malloc在C动态内存 (也就是堆)中创建 struct ,并返回指向它的指针,例如

 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提供fooptr内的地址)。

当然,当它变得无用时,你永远不应该忘记free malloc -ed指针。 担心内存泄漏 , 缓冲区溢出和未定义的行为 。 阅读更多关于malloc(3)和free

顺便说一句,在实践中你应该决定谁负责free记忆。 在上面的make_foo示例中, make_foo的第二个参数应该是一个文字字符串(如果它是malloc -ed,例如使用strdup(3) ,你需要在其他地方free它,这变得非常混乱)。

在实践中,您应该记录有关谁负责 free一些动态的以前malloc内存的约定 。 您可能希望使用valgrind (如果您的系统具有它),并且,如果使用最近的GCC编译器,则使用其-fsanitize = address选项来捕获与内存相关的错误。 很多时候,您碰巧编写了制作和销毁函数的代码(如此处或此处 )。

您可能想要阅读有关垃圾收集的信息 (至少,要了解概念,例如引用计数和术语)。 也许你以后想要使用Boehm的保守垃圾收集器 。