为已经分配的结构成员分配内存有什么好处?
What is the benefit to allocate memory for a member of struct already allocated?
我的问题与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 * 类型)分配内存是一个好习惯吗?
如果我不这样做会怎样?这是一个好习惯吗?
当你这样做时:
localisation_t *locs = (localisation_t*) calloc(5, sizeof(localisation_t));
您创建了一个 localisation_t
的 5 元素数组。然后您可以安全地访问例如 locs[0].start
.
您也可以访问 locs[0].chromosome
,但是这是一个未初始化的指针。你需要为其分配space:
locs[0].chromosome = strdup("my value");
稍后,当您清理时,您需要先调用 free
每个数组成员中的 chromosome
和 sequence
字段,然后再调用数组上的 free
本身:
for (i = 0; i < 5; i++) {
free(locs[0].chromosome);
free(locs[0].sequence);
}
free(locs);
我假设你在问你是否还需要为 chromosome
和 sequence
分配内存以指向。
答案是:视情况而定。您可以将它们设置为指向字符串文字或其他数组,因此在这些情况下您不必分配任何额外的内存。但是,如果 localisation_t
的每个实例都应该有它自己的 unique chromosome
和 sequence
的实例,那么是的,您将需要分配对他们的记忆也是如此:
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 );
我的问题与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 * 类型)分配内存是一个好习惯吗?
如果我不这样做会怎样?这是一个好习惯吗?
当你这样做时:
localisation_t *locs = (localisation_t*) calloc(5, sizeof(localisation_t));
您创建了一个 localisation_t
的 5 元素数组。然后您可以安全地访问例如 locs[0].start
.
您也可以访问 locs[0].chromosome
,但是这是一个未初始化的指针。你需要为其分配space:
locs[0].chromosome = strdup("my value");
稍后,当您清理时,您需要先调用 free
每个数组成员中的 chromosome
和 sequence
字段,然后再调用数组上的 free
本身:
for (i = 0; i < 5; i++) {
free(locs[0].chromosome);
free(locs[0].sequence);
}
free(locs);
我假设你在问你是否还需要为 chromosome
和 sequence
分配内存以指向。
答案是:视情况而定。您可以将它们设置为指向字符串文字或其他数组,因此在这些情况下您不必分配任何额外的内存。但是,如果 localisation_t
的每个实例都应该有它自己的 unique chromosome
和 sequence
的实例,那么是的,您将需要分配对他们的记忆也是如此:
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 );