1

これはこの質問のフォローアップです: C でポインターが表す値を関数に変更させる

演習として、未定型の配列の値を変更するジェネリック関数を作成しようとしています。そう見えるはずだと思います。

void set_value(void * data, void * value, size_t size, int index){
    void * position = data + index*size;
    *position = *value;
}

もちろん、それはコンパイルされません。*position = *value は value のサイズの情報を使用しません (ここでは、データと値の両方が size_t サイズの smthg を指していると仮定しました)。

私が自分のプログラムに言おうとしているのは、「値が指すサイズのメモリのチャンクを取得し、位置が指すアドレスにコピーする」です。

4

1 に答える 1

7

を使用しmemcpy()ます。

void set_value(void * data, void * value, size_t size, int index){
    void * position = (char*)data + index*size;
    memcpy(position, value, size);
}

また、void ポインターの算術演算は有効な C 言語ではありませんが、コンパイラの拡張機能として許可されている場合もあります。char*最初にキャストする必要があります。

于 2013-10-25T04:40:41.293 に答える