【问题标题】:How can a function create a struct?函数如何创建结构?
【发布时间】:2015-06-30 12:32:37
【问题描述】:

我在 C 编程课程中的一项作业是定义一个名为 create_card 的函数。该函数接收一个花色字符和一个卡片值,并返回一个 card_t 结构。

问题:一个函数应该如何创建一个结构?它不能只为结构创建值吗?是我误解了问题的意思还是作业写错了?

【问题讨论】:

  • 如果您发布代码会有所帮助
  • 我没有任何代码。这是一个任务。它们为您提供要遵循的参数,您必须自己设计。
  • 您是否迷失了语言学?函数不能创建类型(嘿,结构是类型,所以创建结构意味着创建类型,对吗?)——这仍然是程序员必须做的事情,在像 C 这样的静态类型语言中。它可以创建 某些类型的对象,这可能就是我们使用的讨厌的自然语言中的意思。
  • 我是按照作业上写的那样逐字写的。我不知道作业是否有错别字。

标签: c struct


【解决方案1】:

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

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
【解决方案2】:

您可以返回 struct 从类似ForceBru's answer 的函数中,或者您可以创建 structC dynamic memory(又名堆),使用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)(或至少,freefooptr 中的地址)。

当然,你永远不应该忘记free 一个malloc-ed 指针,当它变得无用时。害怕memory leaksbuffer overflowundefined behavior。阅读有关malloc(3)free 的更多信息。

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

在实践中,您应该将关于谁负责 的约定记录到free 之前动态地mallocated 内存。您可能想要使用valgrind(如果您的系统有它),并且,如果使用最近的GCC 编译器,它的-fsanitize=address option 来寻找与内存相关的错误。很多时候,您碰巧同时编写了创建函数和销毁函数的代码(例如 herehere)。

您可能想了解garbage collection(至少要了解reference counting 等概念和术语)。也许你以后会想使用Boehm's conservative garbage collector

【讨论】:

  • 不再需要时不要忘记free(fooptr);
  • 文字字符串是一个常量字节数组,以零字节结尾。数组衰减为指针。
猜你喜欢
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
  • 2019-12-03
  • 2021-06-12
  • 2013-08-24
  • 1970-01-01
相关资源
最近更新 更多