2012-03-08 32 views
1

私はそうのような構造体要素上のmemsetを使用しようとしている:struct要素にmemsetを使用する適切な方法は何ですか?

memset(&targs[i]->cs, 0, sizeof(xcpu)); 

はしかし、そうすることは私にセグメンテーションフォールトを与えます。私はこれがなぜ失敗しているのか、それをどのように働かせることができないのか理解もしていない。 構造体の要素にmemsetを使用する適切な方法は何ですか?なぜ私のメソッドは機能しませんか? targsにメモリを割り当て

ライン:構造体素子Cs(xcpu_context)と構造体targsため

eargs **targs = (eargs **) malloc(p * sizeof(eargs *)); 

構造体の定義(execute_args):

typedef struct xcpu_context { 
    unsigned char *memory;    
    unsigned short regs[X_MAX_REGS];  
    unsigned short pc;     
    unsigned short state;    
    unsigned short itr;     
    unsigned short id;     
    unsigned short num;     
} xcpu; 

typedef struct execute_args { 
    int ticks; 
    int quantum; 
    xcpu cs; 
} eargs; 
+4

Cプログラムで 'malloc()'の戻り値をキャストしないでください。 –

+1

* targsを初期化するコードはどこですか? –

+0

@HansPassant - そこにはない、おそらくそれが問題だ。 –

答えて

2

あなたはポインタの配列を割り当てました行内

eargs **targs = (eargs **) malloc(p * sizeof(eargs *)); 

ですが、要素自体は初期化されていません。したがって、このsegfaultは構造体のフィールドにmemsetを適切に使用することとは何の関係もなく、uininitializedメモリを使用することから得られます(ポインターの配列を割り当てた後に各eargsオブジェクトを初期化するループがないと仮定します)。あなたはp eargsオブジェクト(私は大まかにここに用語「オブジェクト」を使用しています)の動的配列を割り当てたい場合

代わりに、あなたの代わりに

eargs *args = malloc(p * sizeof(eargs)); 
if (!args) { 
    /* Exit with an error message */ 
} 
memset(&(args[i].cs), 0, sizeof(xcpu)); 

を記述します。 argsは動的に割り当てられたeargsオブジェクトの配列であり、ではなくのポインタが動的に割り当てられているため、eargs **ではなくeargs *の型です。

+0

あなたは配列をそのように作成しているなら、あなたは '&args [i] .cs'を望むと思います。 –

+0

@CarlNorumあなたは正しいです。一定。 –

1

メモリ割り当て行は、構造体へのポインタに対してのみ、構造体にメモリを割り当てません。あなたがその全体の配列にメモリを割り当てたい場合は、構造体自身のためにメモリを割り当てるためにループを追加する必要があります。

for (i = 0; i < p; i++) 
    targs[i] = malloc(sizeof(eargs)); 

あなたが実際上で動作する構造をしたら、あなたのmemset()呼び出しは問題ないはずです。