【问题标题】:What is the benefit to allocate memory for a member of struct already allocated?为已分配的结构成员分配内存有什么好处?
【发布时间】:2015-12-15 18:00:19
【问题描述】:

我的问题类似于this。 想象一下这个结构:

  typedef struct {
        char *chromosome,*sequence;
        int start,end;
    } localisation_t;

我想为这个结构的一个数组(5 个元素)分配内存。我会尝试类似的东西: (语法肯定是错误的,因为你可以假设我不会流利地使用 C 语言)。

localisation_t *locs = (localisation_t*) calloc(5, sizeof(localisation_t));
strArray[0] = (localisation_t* ) malloc(sizeof(localisation_t));

我经常看到结构成员也可以分配内存。我不明白为什么,因为您已经为 struct 分配了内存?!但是好吧,你不知道它会包含什么。 (here 在名称变量成员上带有 strdup 的示例)。 为 struct 的成员分配内存(主要是 char * 类型)是一种好习惯吗?

如果我不这样做会怎样?这是一个好习惯吗?

【问题讨论】:

  • 你的问题没有多大意义。 strArray 到底是什么?
  • @Joachim Pileborg:即使您使用 c++ 编译器?我在某处读到它在 C++ 中是必要的。
  • @ZheFrench :如果您使用 C++ 编译器编译,则需要强制转换。
  • @ZheFrench:是的,C++ 要求你转换malloc 的结果(C++ 不允许void * 和其他指针类型之间的隐式转换)。但是,如果您正在编写 C++,则应该使用 new 运算符而不是 malloc(如果可以,您应该使用处理所有内存管理的标准容器类型,如 vectormap给你)。

标签: c struct allocation


【解决方案1】:

我假设您在问是否还需要为 chromosomesequence 分配内存以指向。

答案是:视情况而定。您可以将它们设置为指向字符串文字或其他数组,因此在这些情况下您不必分配任何额外的内存。但是,如果localisation_t 的每个实例都应该有它自己的唯一chromosomesequence 实例,那么是的,您还需要为它们分配内存:

char seq[] = "CGCTATCCC";
localisation_t *locs = calloc( 5, sizeof *locs ); 
...
locs[0].sequence = "CGCTATCCC";          // set sequence to point to string literal
locs[1].sequence = seq;                  // set sequence to point to another array
locs[2].sequence = strdup( "GGCCGGTT" ); // allocate memory for a duplicate string, 
                                         // set sequence to point to it

locs[3].sequence = malloc( strlen( "GGCCGGTT" ) + 1 ); // same as above, assumes
locs[3].sequence = strcpy( "GGCCGGTT" );               // strdup isn't available

...

free( locs[3].sequence );
free( locs[2].sequence );
/**
 * Don't need to free locs[1].sequence or locs[0].sequence, since they
 * point to objects that were not allocated using malloc or calloc
 */
free( locs );

【讨论】:

  • 是的,这就是我要解决的问题。我理解您的代码,但我对染色体和序列的唯一实例的概念感到不舒服。你能告诉我更多关于这个想法的信息吗?
  • @ZheFrench - 基本上,我在问localisation_t 的每个实例是否意味着有自己的chromosomesequence 的唯一副本,即使它们包含相同的值(对于例如,locs[0]locs[2] 都引用了“ch1”处的序列“ACCGT”,但无论出于何种原因,您都不希望它们共享存储这些值的内存)。
【解决方案2】:

当你这样做时:

localisation_t *locs = (localisation_t*) calloc(5, sizeof(localisation_t));

您创建了一个由 localisation_t 组成的 5 元素数组。然后您可以安全地访问例如locs[0].start

您也可以访问locs[0].chromosome,但这是一个未初始化的指针。你需要为它分配空间:

locs[0].chromosome = strdup("my value");

稍后,当您清理时,您需要在每个数组成员中调用 free chromosomesequence 字段,然后再对数组本身调用 free

for (i = 0; i < 5; i++) {
    free(locs[0].chromosome);
    free(locs[0].sequence);
}
free(locs);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 2014-12-17
    • 2016-01-27
    相关资源
    最近更新 更多