2016-03-31 18 views
0

C言語(C++ではなく)を使用してセクションメモリに関するメタデータを格納するために、ヒープ上のメモリセクションの最初の数バイトを使用しようとしています。構造体を割り当てられたcharメモリ空間にキャストする

ヒープ領域を使用して作成されます。

char* start_mem = (char*)malloc(10*sizeof(char)); //10 bytes of memory 

今、私は、割り当てられたヒープ空間の最初の4つのバイトに「メタ」構造体を配置しようとしています。

typedef struct{ 
    int test; 
}meta_t; 

これは私が大きなコードで実装する前にそれを行う方法を理解するために使用しているテストコードです。

test #include <stdio.h> 

typedef struct{ 
    int test; 
} meta_t; 

int main(void) { 

    char* start_mem = (char*)malloc(10*sizeof(char)); 

    meta_t meta; 
    meta.test = 123; 

    return 0; 
} 

サイドノート:

int test = 123; 
char c = (char) test; 

が、このタイプのキャストは?:

meta_t meta; 
meta.test = 123; 
char c = (char) meta; 

主な質問は、私は "を合うことができる方法ですされていません。なぜ、このタイプの鋳造作業を行いますstart_memの先頭にある4つの文字サイズ(1バイト)のスペースに「meta」データタイプ(4バイト)を挿入しますか?

FYI - これは、データ構造クラスの大きなプロジェクトの小さな部分です。 「なぜ、あなたはこれをやるのをやってもらえませんか?」と答える必要はないと言っています。または "function_abc()を使用して同じことを行うことができます。"制限が設定されています(つまり、malloc()の1回の使用です)、私はそれに従います。

+0

質問:私はどのように4つの文字サイズ(1バイト)に 'メタ'データタイプ(4バイト)を適合させることができますか? – Boiethios

+0

@Morovaille - yes – Darrell

+0

'malloc(10 * sizeof(char))'は 'malloc(10)'に置き換えることができますが、理解しやすいように '* sizeof(char) –

答えて

0

あなたはmemcpy使用することができます。この1について

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

typedef struct{ 
    int test; 
} meta_t; 

int main() { 

    char *start_mem = malloc(10); 

    meta_t meta; 
    meta.test = 123; 

    memcpy(start_mem, &meta, sizeof(meta)); 

    printf("Saved: %d\n", ((meta_t *)(start_mem))->test); 

    return 0; 
} 
+0

素晴らしい!ありがとうLPs。 – Darrell

0

あなたは作ることができます。

*((meta_t *)start_mem) = meta; 

(あなたはstart_memがmeta_tした場合のように振る舞います)。または

memcpy(start_mem, &meta, sizeof(meta_t)); 

読み込み時にクリーナーです。

+0

私はこれを行うことができますか? *((meta_t *)start_mem)= meta.test; ? – Darrell

+0

メタは4バイトですが、将来は任意のサイズになります。 – Darrell

+0

はい、動作します: 'char *'には、[0、0、0、123]、つまりintのオクテットがあります。あなたが 'int *'としてそれをキャストすると、intを取得します。 – Boiethios

0

何を?あなたはエンディアンに注意を払わなければならない

memcpy(start_mem, &meta, sizeof meta); 

注意。

関連する問題