为已分配的struct成员分配内存有什么好处?

时间:2015-09-18 14:28:26

标签: c struct allocation

我的问题类似于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));

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

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

2 个答案:

答案 0 :(得分:1)

执行此操作时:

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之前,您需要在每个阵列成员中调用chromosome sequencefree个字段:

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

答案 1 :(得分: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 );