C-给定地址而不是指针时的内存分配操作

C-给定地址而不是指针时的内存分配操作,c,pointers,dynamic-memory-allocation,memory-address,C,Pointers,Dynamic Memory Allocation,Memory Address,因此,我知道在C语言中,可以通过引用或值传递函数参数,但从技术上讲,一切都是通过值传递的(因为通过引用传递的实体只是地址) 我的问题是,如果给定的内存地址不是指针,是否可以对该地址执行malloc/calloc操作 这是我正在处理的一个示例: typedef struct bucket { int instances; char *key; struct bucket *next; } Bucket; typedef struct bag { int key_c

因此,我知道在C语言中,可以通过引用或值传递函数参数,但从技术上讲,一切都是通过值传递的(因为通过引用传递的实体只是地址)

我的问题是,如果给定的内存地址不是指针,是否可以对该地址执行malloc/calloc操作

这是我正在处理的一个示例:

typedef struct bucket {
    int instances;
    char *key;
    struct bucket *next;
} Bucket;

typedef struct bag {
    int key_count;
    int current_capacity;
    Bucket **buckets;
} Bag;

void init_bag (Bag *bag){...}
在这个init_bag函数中,我需要获取在别处声明的包的地址并初始化它。但我不知道如果只给我bag的内存地址,我会怎么做,如:

Bag bag;
init_bag(&bag);

我以前做过类似的事情,我在init_bag函数中取了一个指向一个包的指针,并在函数参数的曾经被取消引用的实体上使用了malloc(在这里,它是指向包的简单指针),修改这个的操作是标准的指针操作,可以为行李的实际地址设置一个值。不过这一次,我需要有我上面写过的形式的函数原型,它需要能够接收包的地址(不仅仅是指向包的指针),并对该地址执行适当的内存分配操作。在目前的情况下,我能做些什么?在您的示例中,
bag
的内存已经分配好了。将其定义为局部变量时,如下所示:

Bag bag;
您已经在本地存储中创建了一个内容未初始化的结构。因此,函数
init\u bag
不应分配内存,它只应初始化结构的字段,例如:

void init_bag(Bag *bag) {
    bag->key_count = 0;
    bag->current_capacity = MAX_BAG;
    bag->buckets = calloc(MAX_BAG, sizeof(*bag->buckets));
}
从该函数返回后,您有一个有效的
:您已将有效字段填入已存在的结构中,并通过指针访问该结构

如果您只传递了结构,那么您将初始化一个本地结构,以
init\u bag
。从
init_bag
返回后,此结构将丢失,并且调用函数中的
bag
将像以前一样未初始化。传递
bag
地址的原因是,您可以通过指针从
init\u bag
中访问调用函数中创建的
bag
对象。获取对象的地址会创建指向该对象的指针

另一方面,您在最后一段中描述的代码会导致如下结果:

void new_bag(Bag **bag) {
    *bag = malloc(sizeof(**bag);

    (*bag)->key_count = 0;
    (*bag)->current_capacity = MAX_BAG;
    (*bag)->buckets = calloc(MAX_BAG, sizeof(*(*bag)->buckets));
}
Bag *bag;

new_bag(&bag);
你会这样称呼它:

void new_bag(Bag **bag) {
    *bag = malloc(sizeof(**bag);

    (*bag)->key_count = 0;
    (*bag)->current_capacity = MAX_BAG;
    (*bag)->buckets = calloc(MAX_BAG, sizeof(*(*bag)->buckets));
}
Bag *bag;

new_bag(&bag);
这段代码与第一段代码非常相似,但它做了一些其他的事情。它将像上面一样初始化
Bag
结构,但它将首先在堆上创建
Bag
对象。如果您离开当前功能,则包仍然有效,而使用

Bag bag;

init_bag(&bag);
仅限于当前范围。您更喜欢哪种变体(或者您是否应该同时实现这两种变体)取决于您希望如何使用行李

(这里的整个讨论实际上是关于包的内存分配。它不是指存储桶的内存分配。因为您的结构请求资源,所以您还应该有一个清理功能,可以再次释放这些资源


如果您选择使用malloc在堆上分配包,当然,在清理结构时也必须释放内存。)

欢迎使用堆栈溢出。如果您尚未阅读,请阅读本页。我感到困惑:内存地址是指针,指针是内存地址(好吧,在大多数情况下,这是准确的)-你想要做什么区别并不明显。在
bag_init()
内,使用
bag->key_count=0
将密钥计数设置为0,等等。或者,如果您不正常,您可以编写
(*bag)。key\u count=0包中的
bucket
元素使用双指针?内存地址不是指针,而是使用指针数据类型存储的。此外,您指的是什么“malloc/calloc操作”。这两个函数都不将指针作为参数。你想采取什么样的“行动”?您的
示例看起来与它应该的完全一样。您正在将
Bag
对象的地址作为值传递给一个函数,该函数的指针指向声明为接收所述地址的形式参数的相同类型(
Bag
)。那么问题是什么呢?