我正在使用这样的结构:
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
谁能告诉我如何处理它。谢谢!
答案 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个片段。