Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.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_File_Structure_Share_Global - Fatal编程技术网

在两个文件之间共享全局结构(在C中)

在两个文件之间共享全局结构(在C中),c,file,structure,share,global,C,File,Structure,Share,Global,我有两个文件,main.c和hash.c 在hash.c中,我只有一个名为hashtable的空哈希表和一些函数(不是main) 在main.c中,我有main()函数和#include“hash.h” 我的问题是,如果在main.c中,我从hash.c调用一个函数,比如:hash\u add(“草莓”,3),它在hash.c的hash表中添加一个键及其元素(称为hashtable) 那么如果我在main.c中做了extern hash*hashtable,我的3个草莓会在hashtable中吗

我有两个文件,main.c和hash.c

在hash.c中,我只有一个名为
hashtable
的空哈希表和一些函数(不是main) 在main.c中,我有main()函数和
#include“hash.h”

我的问题是,如果在main.c中,我从hash.c调用一个函数,比如:
hash\u add(“草莓”,3)
,它在hash.c的hash表中添加一个键及其元素(称为
hashtable

那么如果我在main.c中做了
extern hash*hashtable
,我的3个草莓会在hashtable中吗?或者我的哈希表是空的

(我的想法是,当我调用hash_add(“草莓”,3)时,只要我在函数范围内,我的3个草莓就在哈希表中)


谢谢

在C语言中,有两种方法可以做到这一点。听起来您使用的是全局变量,所以我将首先介绍这一点。更好的方法是使用局部变量,我将向您展示第二种方法:

使用全局变量,您可以执行以下操作:

// hash.h
void hash_add(const char* key, int value);
extern hash h;

// hash.c
hash h;
void hash_add(const char* key, int value) { ... }

// main.c
#include "hash.h"
int main()
{
    hash_add("strawberry", 3);
    // h will now have three strawberries
}
最好不要使用全局变量,因为这样会减少名称冲突,并且一次可以有多个哈希表。在这种情况下,您通常会持有一个指向散列的指针,然后将其传递给散列函数:

// hash.h
void hash_add(hash* h, const char* key, int value);
hash* hash_create();
void hash_destroy(hash* h);

// main.c
#include "hash.h"
int main()
{
    hash* h = hash_create();

    hash_add(h, "strawberry", 3);
    // h will now have three strawberries

    hash_destroy(h);
}

如果您有
hash*hastable
在hash.c中,您必须编写
extern hash*哈希表在您希望使用变量的其他每个文件中。