【问题标题】:Memory allocation of nested char pointer嵌套 char 指针的内存分配
【发布时间】:2021-11-22 09:44:42
【问题描述】:

我有一个关于在结构中为给定 char 指针分配内存的问题。以下 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");

但这给了我编译器警告。

【问题讨论】:

    标签: c string struct initialization allocation


    【解决方案1】:

    我想使用 strcpy 将字符串放到 char *str 指向的位置。但据我所知,这是行不通的,因为 *str 指向的地方没有分配内存,对吧?

    没错。

    我的问题是,如何在不更改给定 typedef bson_value_t 的情况下实现这一点?我需要为我初始化的任何bson_value_t 分配内存吗?

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

    就数据结构本身而言,字符串数据可以是动态分配的,也可以是静态分配的(比如字符串字面量的内容),甚至可以是本地声明的数组(自动已分配),但如果字符串数据的生命周期短于 bson_value_t 的生命周期,最后一个会出现问题。

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

    【讨论】:

    • 好吧,我的问题有点误导,对不起。如果我有一个 DataPackage,假设 1000 个 ObjectInfos 都包含一个 bson_value_t,并且我希望每个 *str 指针都指向一个已知字符长度的空字符串,那么我以后可以简单地在我的主程序中填充字符串.我是否需要手动分配内存并将其分配给多个 for 循环中的每个 *str 指针等等,还是有办法解决?
    • @Psoke,您可以进行 1 次大分配,而不是循环中的多个分配。但是你仍然需要循环执行任务。
    猜你喜欢
    • 2019-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 2011-02-23
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    相关资源
    最近更新 更多