【发布时间】:2015-05-04 06:38:52
【问题描述】:
所以,我知道在 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 bag;
init_bag(&bag);
我之前做过类似的事情,我在 init_bag 函数中获取了一个指向 bag 的指针,并在函数参数的曾经取消引用的实体上使用了 malloc(此时它只是一个指向袋),以及修改它的操作是标准的指针操作,可以为袋的实际地址设置一个值。不过这一次,我需要有我上面写的形式的函数原型,它需要能够接收一个包的地址(不仅仅是一个指向包的指针)并对该地址进行适当的内存分配操作.在目前的情况下我能做些什么有什么建议吗?
【问题讨论】:
-
欢迎来到 Stack Overflow。如果您还没有这样做,请阅读About 页面。我很困惑:一个内存地址是一个指针,而一个指针是一个内存地址(嗯,在大多数情况下这是准确的)——你试图做出什么区分并不是很明显。在
bag_init()内部,您使用bag->key_count = 0;将密钥计数设置为0,等等。或者,如果您不正常,您可以编写(*bag).key_count = 0;,但您的代码可读性会降低,这是一件坏事。您确定需要为Bag中的buckets元素添加双指针吗? -
内存地址不是指针,而是使用指针数据类型存储的。
-
您指的是什么“malloc/calloc 操作”。 这些函数都没有将指针作为参数。你想到了什么样的“操作”?您的
Bag示例看起来与它应该的完全一样。您将Bag对象的地址作为值传递给一个函数,该函数具有指向相同类型(Bag) 的指针,该指针声明为接收所述地址的形式参数。那么问题出在哪里?
标签: c pointers dynamic-memory-allocation memory-address