0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

C言語におけるメモリ操作:構造体のコピーとサイズ情報の保存

Last updated at Posted at 2024-01-17

C言語では、メモリ操作は非常に重要なテーマです。この記事では、特定のメモリ領域に構造体をコピーし、その構造体のサイズ情報を領域の末尾に保存する二つの異なる方法を紹介します。

方法1: memcpy と直接代入を使用

まず、構造体Aを定義します。その後、指定されたメモリ領域にこの構造体をコピーし、構造体のサイズを領域の末尾に直接代入する方法を見ていきます。

構造体Aの定義:

typedef struct {
    char data[128];  // このサイズは変更可能
} StructA;

関数の実装:

void copyStructAAndSaveSize(void *ptr, size_t size) {
    StructA a;
    size_t structSize = sizeof(a) > size / 2 ? size / 2 : sizeof(a);

    // 構造体Aを領域の先頭にコピー
    memcpy(ptr, &a, structSize);

    // 構造体Aのサイズを領域の末尾に保存
    size_t *sizePtr = (size_t *)((char *)ptr + size - sizeof(size_t));
    *sizePtr = structSize;
}

方法2: memcpy と memset を使用

次に、memset 関数を使用して構造体Aのサイズ情報をメモリ領域の末尾に保存する方法を紹介します。ここでは、サイズ情報をバイト配列に変換してから memset でコピーします。

関数の実装:

void copyStructAAndSaveSizeUsingMemset(void *ptr, size_t size) {
    StructA a;
    size_t structSize = sizeof(a) > size / 2 ? size / 2 : sizeof(a);

    // 構造体Aを領域の先頭にコピー
    memcpy(ptr, &a, structSize);

    // 構造体Aのサイズをバイト配列に変換
    unsigned char sizeArray[sizeof(size_t)];
    for (int i = 0; i < sizeof(size_t); ++i) {
        sizeArray[i] = (structSize >> (i * 8)) & 0xFF;
    }

    // memsetでサイズ情報を領域の末尾にコピー
    for (int i = 0; i < sizeof(size_t); ++i) {
        memset((unsigned char *)ptr + size - sizeof(size_t) + i, sizeArray[i], 1);
    }
}

結論

これら二つの方法は、C言語におけるメモリ操作の基本的なテクニックを示しています。直接代入を使う方法はよりシンプルで直感的ですが、memset を使用する方法はサイズ情報をバイト単位で操作する際に有用です。プログラミングにおいては、状況に応じて最適な方法を選ぶことが重要です。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?