2016-10-17 9 views
-3

私は連続メモリ割り当ては

struct mystruct { int x; int size_of_data; int *data; }

ような構造を持っていると私は体mystructとデータ用の連続メモリ領域にメモリを割り当てたいです。 私はmalloc(sizeof(struct mystruct)+size_of_data*sizeof(int))を試しましたが、私はセグメンテーション違反があります。

は、私も試してみました:

struct mystruct *var = malloc(sizeof(*var)) 
var->data = malloc(size_of_data*sizeof(int)) 

が、問題は、アロケータはvar->dataが全体の構造体へのcontiuousになることを保証するものではありませんが、私は強く、連続する必要があるということです。何か案は?

mystruct

+1

'malloc関数(はsizeof(構造体体mystruct)+ size_of_data *はsizeof(int型))'年コードとエラー – pm100

+2

あなたの最初の試みが実行可能であるがwork.SHowする必要があり、あなたが持っている必要がありますどこかでミスをした。 [MCVE](http://stackoverflow.com/help/mcve) –

答えて

2

そのまま滞在する必要がありますあなたは右の割り当てを持っていましたが、あなたはint Sを指すようにあなたのdataメンバーを初期化する必要があります。また

struct mystruct *s; 
s = malloc(sizeof(struct mystruct)+size_of_data*sizeof(int)); 
assert(s); 
s->data = (int *)(s+1); 
/* now can use data member like an array */ 

、あなたはdata柔軟な配列を作るためにmystructのあなたの定義を変更することができます。その後、dataは、スペースを割り当てたintの冒頭にあります。

struct mystruct { 
    int x; 
    int size_of_data; 
    int data[]; 
}; 

struct mystruct *s; 
s = malloc(sizeof(struct mystruct)+size_of_data*sizeof(int)); 
assert(s); 
/* now can use data member like an array */ 
+1

@ user3528438を投稿してください。より強いアライメントがより弱いアライメント要件を満たすため、投稿されません。 – 2501

+0

@ 2501彼はおそらく弱い整列を意味した。この特定の構造体では起こりません。 –

+0

@ user3528438 'sizeof(struct ...)'は、 'struct'のアラインメント要件よりも小さい値を返すことができますか?もしそうなら、物事は面白くなるでしょう。 –

2

「柔軟な配列メンバー」が必要です。 6.7.2.1構造と組合指定子the C Standardの段落18、当たり:

特別な場合として、複数の 命名部材と構造体の最後の要素は、不完全な配列型を有していてもよいです。これは フレキシブルアレイメンバと呼ばれます。ほとんどの場合、フレキシブルアレイ のメンバは無視されます。特に、構造 のサイズは、可撓性アレイ部材が省略されているかのように、 の省略形よりも末尾のパディングがある場合があります。どのようにすればいいのですか? (または - >)演算子はフレキシブルな配列メンバーを持つ構造体へのポインタであり、右のオペランド はそのメンバーの名前を付けて、そのメンバーが で置き換えられたかのように振る舞います。同じ要素タイプ)を使用して、アクセスするオブジェクトよりも大きい構造体を作成します。 アレイのオフセットは、 が置換アレイのオフセットと異なる場合でも、フレキシブルアレイメンバのオフセットのままになります。この配列に が要素を持たない場合、それは1つの要素を持っているかのように動作しますが、その 要素にアクセスしようとすると、それ以上のポインタを生成しようとすると、 の振る舞いは未定義です。

例:

typedef struct flexible 
{ 
    size_t len; 
    char data[]; 
} flexible_t; 

... 

size_t thisMuchData = getAmountOfData(); 
flexible_t *ptr = malloc(sizeof(*ptr) + thisMuchData); 
ptr->len = thisMuchData; 
memcpy(ptr->data, dataSource, thisMuchData);