嵌套char指针的内存分配

Memory allocation of nested char pointer

我对结构内给定字符指针的内存分配有疑问。以下 typedef bson_value_t 由 API 给出,我想在我自己的 typedef ObjectInfo 中使用它,如我的代码所示:

typedef struct _bson_value_t {
    bson_type_t value_type;
    union {
        int64_t v_int64;
        int32_t v_int32;
        int8_t v_int8;
        double v_double;
        struct {
            uint32_t len;
            char *str;
        } v_utf8;
    } value;
} bson_value_t;

typedef struct _ObjectInfo {
    char key[100];
    bson_value_t value;
} ObjectInfo;

我还有其他数据包,其中包含数百种 ObjectInfo 类型,但都简单地初始化如下:

typedef _DataPackage {
    ObjectInfo single;
    ObjectInfo multiple[100];
    ...
} Datapackage;

因此它们还不包含任何有用的数据。我想使用 strcpy 将字符串放到 char *str 指向的位置。但据我所知,这是行不通的,因为 *str 指向的地方没有分配的内存,对吗? 我的问题是,如何在不更改给定 typedef bson_value_t 的情况下完成此操作?我是否需要为我初始化的任何一个 bson_value_t 分配内存?

strcpy(DataPackage.single.value.value.v_utf8.str, "test");

那不行,除非我把它改成:

strcpy(&DataPackage.single.value.value.v_utf8.str, "test");

但这给了我编译器警告。

I would like to use strcpy to put a string to the location where char *str is pointing. But as far as I know that does not work because there is no allocated memory where *str is pointing to, right?

没错。

My question would be, how do I accomplish that without changing the given typedef bson_value_t? Do I need to allocate memory for any one bson_value_t that I initialized?

不,您(为此目的)不需要为任何 bson_value_t 动态分配内存。这些 value.v_utf8.str 成员中的任何一个指向的 space(如果有)将在 bson_value_t 外部,因此安排该内存是一个单独的考虑因素。

就数据结构本身而言,字符串数据可以是动态分配的,也可以是静态分配的(比如字符串字面量的内容),甚至可以是本地声明的数组(自动分配),尽管如果字符串数据的生命周期短于 bson_value_t.

的生命周期,最后一个会出现问题

但是,请确保您知道您从中绘制此图的库做出了哪些假设。例如,如果它的任何函数假定它们可以重新分配 space 以提供加长字符串,或者如果它们假定它们可以就地修改内容,那么此类假设会影响您需要提供的存储类型.