2012-03-02 16 views
0

私が持っている次のようにこのような構造:私は次のようにそれを初期化した機能に初期化された構造体へのポインタを渡す

typedef struct{ 
char static_data[10]; 
int a; 
int b; 
} my_ds; 

my_ds * ds = (my_ds *)malloc(sizeof(my_ds)); 
memmove(my_ds->static_data, buf, len); 
ds->a = c; 
ds->b = d; 

と機能でそれを渡さ:

int my_fun(void ** data); 
my_fun((void *)&ds); 

最初のフィールドmy_funの内部では何が起こるのですか、static [10]は正しく初期化されますが、他の2つの値ゼロである。私はここで何が欠けていますか?

+1

'チャー静的[10]' Cに空隙ポインタにキャストすることができますか? 'static'0oと呼ばれるフィールドをどう宣言しましたか? – cnicutar

+0

申し訳ありませんが、修正しました。 – CodeBladeRunner

+0

'len'はどれくらい大きいですか? – cnicutar

答えて

0

memmove()?私はあなたmemcpy()またはstrcpy()または多分strncpy()を使用するつもりだったと思います!

double **は(おそらく)不要ですmy_fun(void **data) voidポインタは、voidポインタを含む何かを指すことができます。 (しかし、これは関数の定義に依存しません)

この場合、my_fun ((void**) &ds);のアンパサンド(またはキャスト)も必要ありません。 任意ポインタが

my_ds * ds; 
ds = malloc(sizeof *ds); 
if (len >= sizeof my_ds->static_data) len = sizeof my_ds->static_data - 1; 
memcpy(my_ds->static_data, buf, len); 
my_ds->static_data[len] = 0; 
ds->a = c; 
ds->b = d; 
+0

'memmove()'に何が問題なのですか?オーバーラップするバッファを処理する方法を知っているのは 'memcpy()'だけです。 –

+0

技術的には何も問題はありません。しかし、この場合、バッファは重なり合うことができないので、memmove()は必要ありません。 len引数は、コピーに使用される関数とは関係なく、エラーの潜在的なベクトルです。 – wildplasser

+0

1.あなたは* void ***のことが正しいです。私は気づいたはずです。私はあなたの提案を実行し、更新を投稿します。コメントありがとう – CodeBladeRunner

関連する問題