3

我正在使用这样的结构:

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

我想初始化结构,并使用 malloc() 方法返回这样的动态内存

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

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

frag->seq="01001";

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

Uninitialised value was created by a heap allocation

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

4

4 回答 4

6

我不确定你在这里有什么真正的问题,但为了适当的礼仪,你的分配是:

Fragment *frag=malloc(10*sizeof(Fragment));
if (frag) memset(frag,0,10*sizeof(Fragment));
于 2009-07-15T02:11:24.867 回答
4

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

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 是否真的成功:)

于 2009-07-15T02:12:15.630 回答
2

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

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

于 2009-07-15T02:18:15.603 回答
0

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

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

你确定你需要10*吗?

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

于 2009-07-15T02:13:51.760 回答