函数如何创建结构?
我对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的保守垃圾收集器 。