嵌套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 以提供加长字符串,或者如果它们假定它们可以就地修改内容,那么此类假设会影响您需要提供的存储类型.
我对结构内给定字符指针的内存分配有疑问。以下 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 以提供加长字符串,或者如果它们假定它们可以就地修改内容,那么此类假设会影响您需要提供的存储类型.