我对C编程课程的一个任务是定义一个名为create_card的函数。此函数接收套装字符和卡值,并返回card_t结构。
问题:函数如何创建结构?它不能只为结构创建值吗?我是否误解了问题的含义,还是写错了作业?
答案 0 :(得分: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;
}
答案 1 :(得分:-1)
您可以<{3}}中的某个功能返回 {/ 1}},也可以<{>创建 struct
{ {3}}(也就是堆),使用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
1}})。
当然,当它变得无用时,你永远不应忘记free
malloc
- ed指针。要害怕ForceBru's answer,C dynamic memory和memory leaks。详细了解buffer overflow&amp; free
。
free
- 记忆。在上面的make_foo
示例中,make_foo
的第二个参数应该是文字字符串(如果是malloc
- 例如使用undefined behavior,则需要free
它在其他地方,而且变得非常混乱。)
在实践中,您应该记录谁负责到free
以前动态malloc
内存的约定。您可能希望使用malloc(3)(如果您的系统具有它),并且,如果使用最近的strdup(3)编译器,则使用valgrind来捕获与内存相关的错误。很多时候,您碰巧编写了制作和销毁函数的代码(例如GCC或-fsanitize=address option)。
您可能希望阅读here(至少,了解here等概念和术语)。也许您以后想要使用garbage collection。