Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何访问在一个函数或另一个函数中创建的数据结构,而不返回或传入它?_C_Pointers_Data Structures_Scope - Fatal编程技术网

C 如何访问在一个函数或另一个函数中创建的数据结构,而不返回或传入它?

C 如何访问在一个函数或另一个函数中创建的数据结构,而不返回或传入它?,c,pointers,data-structures,scope,C,Pointers,Data Structures,Scope,如果可以的话,我可以通过在主函数中初始化一个结构副本并将其传递给另一个函数来解决这个问题,但是我不允许更改这个项目的函数头 既然我被赋予了这个功能,我也确信有一个同样好的解决方案,可以帮助我了解如何使用动态内存分配使函数的动作独立于该函数的作用域而持续 我的结构: typedef struct AmNet { // this struct can be changed as needed int size; User ** users; // group of users in th

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

既然我被赋予了这个功能,我也确信有一个同样好的解决方案,可以帮助我了解如何使用动态内存分配使函数的动作独立于该函数的作用域而持续

我的结构:

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
}
在另一个文件的main函数中,仅使用以下命令调用:

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

void addUser( const char *name ) {
}
与结构初始化相同的.c文件中的其他函数也不获取或返回数据结构,但它们可以访问数据结构并对其进行操作。就好像这个结构应该能够被当作一个全局变量来对待


如何实现这一点?

要声明全局变量,请将声明置于所有函数之外

struct AmNet gNet;

void create_net() {
   gNet.front = NULL;
   ...
}
gNet
被广泛认为是不好的做法。如果不能更改原型,我看不出其他方法,但是
静态声明至少会将其保留在文件范围内

/* 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(不带
*
)。否则,它将键入指向结构的指针。