構造体のmemcpyを使用してデータを書き込む方法は?

このQ&Aのポイント
  • C言語で、構造体のmemcpy関数を使用してデータを書き込む方法を教えてください。
  • 質問者は、特定の構造体の一部の情報だけをコピーしたいと考えています。
  • どのようにしてmemcpyを使って、特定の構造体の一部の情報を書き込むことができますか?
回答を見る
  • ベストアンサー

構造体のmemcpy書き込む

struct{ char a; char b; } test01_t struct{ char c; char d[3]; } test02_t struct{ test01_t test01; test02_t test02; } 書き込み先の領域の先頭アドレス char* Addr; データ構造が以下になっている状態で、 struct{ test01_t test01; test02_t test02; } test01_t test01の領域には書き込まず test02_t test02の情報だけ 領域にmemcpyまたはその他の方法で書き込みむにはどうしたらよいでしょうか? よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

…………下記の間違い…ですよね? struct test01_t { char a; char b; }; struct test02_t { char c; char d[3]; }; >struct{ >test01_t test01; >test02_t test02; >} にタグ名などがないのが難しいところでしょうかねぇ……。 タグ名などついていれば、Addrをキャストするなり方法があるかと思いますが。 Addrをstruct test01_t *にキャストして+1する…なんて無茶もなくはないでしょうが、 正しく動作してくれる保証はありませんしね。 # 構造体アライメントでパディングが詰められている可能性もありますし。 というワケで私ならば、「タグ名つけて正しくアクセスできるようにする」ってところでしょうか。 struct test03_t { test01_t test01; test02_t test02; }; で、 ((struct test03_t *)(Addr))->test02 かな。

その他の回答 (1)

  • TT414
  • ベストアンサー率18% (72/384)
回答No.1

typedef struct{/*typedef追加*/ char a; char b; } test01_t;/*;追加*/ typedef struct{/*typedef追加*/ char c; char d[3]; } test02_t;/*;追加*/ struct{ test01_t test01; test02_t test02; }test;/*変数名と;追加*/ char* Addr; の場合は「memcpy(&test.test02,Addr,sizeof(test.test02));」です。

関連するQ&A

  • 関数マクロの書き方

    #difine GET_INFO(data) \ do{\ char* addr = topaddr + sizeof(int);\ memcpy(&data,addr,sizeof(int)); \ while(0) 取得さきのメモリのデータ構造は typedef struct _data_t{ int data[2] }data_t data_t test; メモリ上のデータの先頭アドレスはtopaddrとなっている状態で test.data[1] の値を取得する関数マクロの定義としてGET_INFOの書き方は 間違っていますでしょうか?

  • 構造体から他の構造体への代入

    現在C言語で簡単なプログラミングを書いているのですが、 構造体(1)(下記参照)から、構造体(2)(下記参照)への代入の方法がわからず悩んでいます。もしよければ手を貸してください!! 標準関数などがないということはわかったので、 地道に代入を行いたいです。 イメージ・・・(data[n].b = moji[n].d;) (1)struct list_kouzou{ int a; char b[30]; char c[8]; }data[100]; (2)struct list_tai{ char d[30]; }moji[15];

  • 条件によって構造体のリスト構造を変えたい

    こんにちは。 C(C++)で構造体を使っているのですが、まだまだ未熟で使い方が良く分かりません。以下のことを実施したいのですが、やり方をどなたかご教授頂けませんでしょうか。よろしくお願いします。 条件によって構造体のリスト構造を変えたいのです。 例えば、 条件1の場合は 構造体a→構造体b 条件2の場合は、 構造体a→構造体c 上記のようにです。そして構造体のルートから参照先をたどっていくことで、配下の構造体の値を取得したいのです。 文法上許されないようですが、イメージとしては、 struct a aa; aa.c->b.aa ということをしたいのです。よろしくお願いします。 struct a{ char a; char b; struct c; : }; struct b{ char aa; : }; struct c{ : : };

  • 構造体を型の異なる構造体に代入

    C言語初心者です。 今回の質問は入力された構造体のメンバのデータを型の異なる構造体に代入したいのですが、毎回コンパイラにおこられてしまいます(汗)具体的には typedef struct MSG{ longint type; int flg; int Dt[64]; }t_msg; このDt[64]を以下の構造体に代入します。 typedef struct SC_MSG{ char a; char b; short c; char d; char e; short f; }t_sc_msg; その際、異なる関数で処理するため、 main(){ foo(&t_msg); }; void foo(t_msg *pt_msgdt){ t_sc_msg = (*pt_msgdt+8); ココがエラーになってしまいます。 何か、根本的な間違いをおかしている気がします。 ご指導の方、宜しくお願いします。 ちなみにOSはLinuxでコンパイラーはgccです。

  • 配列から構造体へデータコピー

    配列から構造体へデータのコピーをしたいのですが、 構造体のメンバがビットフィールドで構成されている時の処理がわかりません。 --------test.c----------- #include <stdio.h> #include <string.h> typedef struct{ unsigned char aaa :1; unsigned char bbb :1; unsigned char ccc :1; unsigned int ddd :13; unsigned char eee :2; unsigned char fff :2; unsigned char ggg :4; }test_t; int main(void) { test_t test_t; unsigned char data[]={0x5F, 0xFE, 0x1C}; memcpy(&test_t, data, 4); printf("aaa = %X\n", test_t.aaa); printf("bbb = %X\n", test_t.bbb); printf("ccc = %X\n", test_t.ccc); printf("ddd = %d\n", test_t.ddd); printf("eee = %X\n", test_t.eee); printf("fff = %X\n", test_t.fff); printf("ggg = %X\n", test_t.ggg); return 0; } ------期待出力--------- aaa = 0 bbb = 1 ccc = 0 ddd = 1FFE eee = 0 fff = 1 ggg = 12 「test.c」を実行した時に「期待出力」のような出力を期待していたのですが、実際には aaa = 1 bbb = 1 ccc = 1 ddd = 1 eee = 0 fff = 0 ggg = 0 と表示されてしまいます。 ビットフィールドで構成された構造体に、配列の値をそのままあてる事は出来ないのでしょうか? 出来るだけ、マスクやシフト演算を使用しないで、配列からビット単位で値を抽出したいのですが・・・

  • ポインタを使って構造体の配列を戻り値にするには

    関数の戻り値を構造体の配列(アドレスを受け渡しを利用して)にしたいのですがうまくゆきません。 以下のプログラムではコンパイルはできるのですが、 a0 = 2 a1 = 4198512 a2 = 4329332 と表示されてしまいa1,a2がうまくゆきません。 ********************************************* #include<stdio.h> struct test{ int a; }; struct test *func(void); void main(void) { struct test *data;//構造体ポインタ int i; data = func(); //ポインタにtest関数の戻り値(アドレス)を代入 for(i=0;i<=2;i++){   printf("a%d = %d\n",i,(data+i)->a); //構造体要素を表示 } } struct test *func(void) { struct test data[3]={1,2,3}; //構造体配列を定義 return (&data[0]); //構造体配列の先頭アドレスを返す } ************************************************* test関数から受ける取ったアドレス(&data[0])をポインタ(data)に代入して1づつずらして表示させれば a0=1,a1=2,a=3 となると思ったのですがどこが間違っているのでしょうか? よろしくお願いします。

  • アドレスを設定した構造体への定数セット

    アドレスを設定した構造体への定数セット 以下のような ソースで TESTDATA に対し定数をセットしたいのですが どのようにコーディングすれば良いのでしょうか? ※ 例1) のように宣言したデータを memcpy しない方法を知りたいです 設定したい定数値) { {"AAA",2}, {"BB",3}, {"CC",8} } struct stTEST {  struct {   char A[10];   int B;  }DT[3] }; #define TESTDATA (*(volatile stTEST*)0x200000) ----------------------------- 例1) struct stTEST_A {  char A[10];  int B; }; struct stTEST_A DT[3] = { {"AAA",2}, {"BB",3}, {"CC",8} }; よろしくお願いします。

  • memcpy関数について

    c言語のmemcpy関数についてなのですが、 文字列の一部を置換する場合にmemcpyを使用したいのですが、使用してやってみたところ動作停止します。memcpyは先頭アドレスを渡さないと動作しないのでしょうか。 また、memcpy関数以外でも、ポインタや配列の先頭アドレスしか渡せないのでしょうか? 例えば、 memcpy(str1,str2,5); ならば、動作しますが、 str1++; memcpy(str1,str2,4); では、動作停止しました。 もし、memcpy関数は先頭アドレスじゃないと動作しない場合は関数を作って出来るのですが…。 もし、不足しているもの等あれば、補足で追加するので回答をお願いします。

  • 構造体の初期化の時にポインタを入れるにはどうしたらいいですか?

    構造体の初期化の時にポインタを入れるにはどうしたらいいですか? 例えば、このような構造体で↓ struct PACKET { uint16_t size; // データの長さ uint16_t *data; // データバイト列 }; 初期化の時にsizeとdataを入れるにはどうしたらいいのでしょうか? dataがuint16_t*じゃなくてchar*なら struct PACKET { uint16_t size; // データの長さ char *data; // データバイト列 }; struct PACKET p = { 5, "12345" }; というようにできるのですが・・・

  • 構造体を取得するには

    publicにcは指定してあるとしまして mainの中に構造体を引っ張り込むにはどうしたらいいのでしょうか? 形式上おかしいところもあると思いますが 宜しくお願いいたします main() { X x; } X::c() { struct a { char b[10]; char c[20]; } return ? }