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 個のフラグメントを割り当てる必要がある場合は、10 個すべてを初期化する必要があります。

于 2009-07-15T02:13:51.760 に答える