gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:42:57 25 4
gpt4 key购买 nike

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

我的问题是,如果给定一个不是指针的内存地址,是否可以对该地址执行 m​​alloc/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 bag;
init_bag(&bag);

我以前做过这样的事情,我在 init_bag 函数中取了一个指向包的指针,我在函数参数的曾经被取消引用的实体上使用了 malloc(此时它只是一个指向包),修改它的操作是标准指针操作,可以为包的实际地址设置一个值。不过这一次,我需要有我上面写的形式的函数原型(prototype),它需要能够接收包的地址(不仅仅是指向包的指针)并对该地址进行适当的内存分配操作.对我在当前情况下可以做什么有什么建议吗?

最佳答案

在您的示例中,bag 的内存已经分配。当您像这样将其定义为局部变量时:

Bag bag;

您在本地存储中创建了一个结构,其内容未初始化。因此,您的函数 init_bag 不应分配内存,它应该只初始化结构的字段,例如:

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

从该函数返回后,您有一个有效的:您已将有效字段填充到一个已经存在的结构中,您可以通过指针访问该结构。

如果您只传递了结构,您将初始化一个局部于 init_bag 的结构。从 init_bag 返回后,该结构将丢失,调用函数中的 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 在堆上分配包,当然,您还必须在清理结构时释放该内存。)

关于C - 给定地址而不是指针时的内存分配操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30023981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com