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

标签 c pointers dynamic-memory-allocation memory-address

因此,我知道在 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/

相关文章:

ios - 修改 Objective-C 函数中的 C 数组

c - 如何在外部服务器上为嵌入式 C 安装和使用编译器?

C 将指向数组的指针传递给函数问题

使用 C 中固定的行数创建二维数组

c# - 一条new语句如何分配堆内存?

我可以这样制作一个动态数组吗?

c - 使用自行设计的 C 编译器构建代码

c - 如何在 C 中打印带有计数的字符串中的重复字母?

c - 如何使用 C 中的指针将一个数组的内容复制到另一个数组?

c++ - C++中的删除操作