结构初始化问题?

时间:2009-07-15 02:07:53

标签: c memory struct malloc

我正在使用这样的结构:

define struct _Fragment{
     int a;
     char *seq;
}Fragment;

我想初始化struct,并使用malloc()方法返回一个像这样的动态内存

Fragment *frag=malloc(10*sizeof(Fragment));

然后我会像这样使用碎片指针:

frag->seq="01001";

然后当我返回大量片段时会出现问题。错误消息说(使用valgrind工具):

Uninitialised value was created by a heap allocation

谁能告诉我如何处理它。谢谢!

4 个答案:

答案 0 :(得分:6)

我不确定你在这里有什么问题,但对于正确的礼仪,你的分配将是:

Fragment *frag=malloc(10*sizeof(Fragment));
if (frag) memset(frag,0,10*sizeof(Fragment));

答案 1 :(得分:4)

问题是即使您使用malloc为Fragment结构分配内存,也没有初始化任何值。 malloc返回的内存不保证是任何特定值,因此您必须显式初始化struct成员

Fragment* frag = malloc(10*sizeof(Fragment));
int i = 0;
for ( i = 0; i < 10; i++ ) { 
  frag[i].a = 0;
  frag[i].seq = NULL;
}

如果你想保证初始化内存,你应该使用calloc。它增加了内存零成本,但对你的应用程序来说可能并不重要。

另外你应该检查malloc实际上是否成功:)

答案 2 :(得分:2)

问题是malloc没有初始化它分配的任何内存。 Valgrind特别注意跟踪尚未初始化的任何内存区域。

你应该注意这个错误,唯一的原因是Valgrind(假设一切正常)应该打印出错误,因为你试图在某个地方使用未初始化的数据,这可能是无意的。但是,使用单元化变量不在您的问题中的代码中。

答案 3 :(得分:0)

您的代码看似合理,但在以下行中;

Fragment *frag=malloc(10*sizeof(Fragment));

您确定需要10*吗?

如果你需要分配10个片段,那么你应该负​​责初始化所有10个片段。