繁体   English   中英

何时将malloc()内存用于struct中的数组

[英]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" ”的内容“存储”到foo1char*变量中。

我现在正在这样做:

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"是一个字符串文字。)

  1. 哪种方式是正确的?
  2. 如果参数const char* name不再是字符串文字,而是在运行时确定长度的任意数组,该怎么办?
  3. 如果Foo_init()的签名不是Foo_init(struct Foo* foo, const char* name)但是Foo_init(struct Foo* foo, char* name) (即char*不再是const )怎么办?
  4. 更一般地, 我需要malloc() / memcpy()内存传入的参数是一个char* (或int* ,或任何拥有一堆存储元件),假设我想“保存它”在struct

哪种方式是正确的?

这取决于用例,但非常喜欢 如果要将指向字符串文字的指针存储到name ,然后尝试修改其内容,则会导致未定义的行为。 如果nameconst ,并且您只需要保存此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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM