【问题标题】:How to access a data structure created in one function, in another function, without returning it or passing it in?如何访问在一个函数中创建的数据结构,在另一个函数中,而不返回或传递它?
【发布时间】:2014-11-08 21:21:41
【问题描述】:

如果可以的话,我会通过在主函数中初始化结构的副本并将其传递给另一个函数来解决此问题,但我不允许更改此项目的函数头。

既然我得到了它,我也确信有一个同样好的解决方案可以帮助我了解如何使用动态内存分配来使函数的操作独立于其范围之外功能。

我的结构:

typedef struct AmNet { // this struct can be changed as needed
   int size;
   User ** users; // group of users in the net
   User *front; // the first user
   User *back; // the last user
} *AmNet;

要创建的函数是:

void create_net(){ // this line cannot be changed
}

在另一个文件的主函数中,简单地调用:

create_net();

然后,例如 -- 这个函数应该能够访问该结构,创建一个新用户,并将其添加到同一结构的用户列表中。

void addUser( const char *name ) {
}

与结构初始化相同的 .c 文件中的其他函数也不会获取数据结构或返回它,但它们可以访问它并对其进行操作。就好像该结构应该能够被视为一个全局变量。

如何做到这一点?

【问题讨论】:

  • 您打算多次调用“create_net”吗?还是它更适合用来创建一个唯一的实例?
  • 只是为了创建它的唯一实例。
  • 只需在文件中的任何函数之外创建结构实例。然后文件中的所有内容都可以访问它。

标签: c pointers data-structures scope


【解决方案1】:

要声明全局变量,请将声明放在所有函数之外。

struct AmNet gNet;

void create_net() {
   gNet.front = NULL;
   ...
}

Global variablesgNet 被广泛认为是不好的做法。如果您无法更改原型,我看不到其他方法,但 static 声明至少会将其保留在文件范围内。

/* in AmNet.c */
static struct AmNet *gNet;

void create_net() {
  gNet = (struct AmNet *)malloc(sizeof(struct AmNet));
  gNet->front = NULL;
 ...
}

【讨论】:

  • 在这种情况下,如何使用 malloc 为 gNet 动态分配内存?出于显而易见的原因,我没想到他会希望我们使用全局变量。赞成静态建议。
  • 谢谢!我认为在这种情况下使用 typedef 来定义结构,它也可以是 gNet = (Amnet*)malloc(sizeof(Amnet))?
  • @Rohawk 要使其正常工作,请将您的 typedef 更改为 typedef struct AmNet {... } AmNet;(没有 *)。否则它将 typedef 指向结构的指针。
猜你喜欢
  • 1970-01-01
  • 2021-08-07
  • 1970-01-01
  • 1970-01-01
  • 2012-02-28
  • 1970-01-01
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多