[英]When to malloc() memory for an array inside a struct
有一个结构
struct Foo{
int a, b, c;
char* name;
};
具有初始化功能
Foo_init(struct Foo* foo, const char* name){
// ... stuff
}
当我创建一个struct Foo
对象时,我传入一个const char*
,作为对象的名称。 例:
struct Foo foo1;
Foo_init(&foo1, "foo1");
目标是将“ "foo1"
”的内容“存储”到foo1
的char*
变量中。
我现在正在这样做:
Foo_init(struct Foo* foo, const char* name){
foo->name = name;
// ... other stuff
}
但我想知道正确的方法是:
Foo_init(struct Foo* foo, const char* name){
int name_len = strlen(name) + 1;
foo->name = malloc(name_len);
memcpy(foo->name, name, name_len)
// ... other stuff
}
(我想两种方式都可以,因为在这个例子中,参数"foo1"
是一个字符串文字。)
const char* name
不再是字符串文字,而是在运行时确定长度的任意数组,该怎么办? Foo_init()
的签名不是Foo_init(struct Foo* foo, const char* name)
但是Foo_init(struct Foo* foo, char* name)
(即char*
不再是const
)怎么办? malloc()
/ memcpy()
内存传入的参数是一个char*
(或int*
,或任何拥有一堆存储元件),假设我想“保存它”在struct
? 哪种方式是正确的?
这取决于用例,但非常喜欢秒 。 如果要将指向字符串文字的指针存储到name
,然后尝试修改其内容,则会导致未定义的行为。 如果name
是const
,并且您只需要保存此string
而不进行修改,则可以先使用。
一种常见的技术是将string
文字放入“ 只读数据 ”部分,该部分以只读方式映射到进程空间(这就是您无法更改它的原因)。 它确实因平台而异。
如果参数const char * name不再是字符串文字,而是在运行时确定长度的任意数组,该怎么办?
没关系,它会是一样的。 如果它的string
(以null结尾的字符序列), strlen
将返回字符数,您可以将它复制到heap
malloced内存。
如果Foo_init()的签名不是Foo_init(struct Foo * foo,const char * name)但是Foo_init(struct Foo * foo,char * name)(即char *不再是const)怎么办?
它不再是const
。 它允许您修改数组的内容。 既然你不需要修改它(它是init函数),你应该把它保留为const
。
更一般地说,我什么时候需要malloc()/ memcpy()内存作为char *(或int *,或者拥有内存中的一堆元素的任何东西)的传入参数,假设我想要“存储它”在结构中?
当您不知道输入数据量并需要在运行时计算它时,您需要在堆上分配具有动态存储持续时间的内存。 自动阵列更安全,更快,所以如果你不必使用动态存储 ,不要。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.