2017-08-02 15 views
0

私はコードの中で同様の構造体を見つけました。これらを使ってみると何とかしてしまった。ここに私が出会った構造体に基づいて書いたものがあります。インデックスを持つ構造体を使ってベクトルを作成する

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

typedef struct MyStruct{ 
    unsigned char *ptr; 
    int len; 
}MyStruct; 
typedef MyStruct *Vec_MyStruct; 

struct MyGroup { 
    int n_MyStruct; 
    Vec_MyStruct myStructs; 
}; 
typedef struct MyGroup MyGroup; 
typedef struct MyGroup *Vec_MyGroup; 

typedef struct MyBigGroup { 
    int n_MyBigGroups; 
    Vec_MyGroup myBigGroups; 
}MyBigGroup; 


int ArrayData(); 

int main(int argc, char *argv[]){ 

    printf("Started..\n"); 
    ArrayData(); 
    return 0; 
} 

int ArrayData() 
{ 
    printf("ArrayData called..\n"); 
    MyStruct bb1; 
    memset(&bb1,0,sizeof(bb1)); 
    bb1.ptr = (unsigned char *)malloc(6); 
    bb1.len = 6; 
    char *ch = "Hello"; 
    memcpy(bb1.ptr, ch, bb1.len); 
    //  printf("1: ptr %s\n", bb1.ptr); 
    //  printf("1: len %d\n", bb1.len); 

    MyStruct bb2; 
    memset(&bb2,0,sizeof(bb2)); 
    bb2.ptr = (unsigned char *)malloc(6); 
    bb2.len = 6; 
    char *c = "World"; 
    memcpy(bb2.ptr, c, bb2.len); 
    //  printf("2: ptr %s\n", bb2.ptr); 
    //  printf("2: len %d\n", bb2.len); 


    Vec_MyStruct vec = malloc(sizeof(vec)); 

    vec[0] = bb1; 
    vec[1] = bb2; 
    printf("vec[0]: ptr %s\n", vec[0].ptr); 
    printf("vec[0]: len %d\n", vec[0].len); 
    printf("vec[1]: ptr %s\n", vec[1].ptr); 
    printf("vec[1]: len %d\n", vec[1].len); 
    // 

    MyGroup perm; 
    perm.n_MyStruct = 2;// 2 My_Struct vectors 
    perm.myStructs = vec; 
    printf("perm.myStructs[0].ptr: ptr %s\n", perm.myStructs[0].ptr); 
    printf("perm.myStructs[0].len: len %d\n", perm.myStructs[0].len); 
    printf("perm.myStructs[1].ptr: ptr %s\n", perm.myStructs[1].ptr); 
    printf("perm.myStructs[1].len: len %d\n", perm.myStructs[1].len); 

    MyBigGroup grp; 
    grp.n_MyBigGroups = 1; 
    grp.myBigGroups = &perm; 


    printf("grp.myBigGroups[0].myStructs[0].ptr: ptr %s\n", grp.myBigGroups[0].myStructs[0].ptr); 
    printf("grp.myBigGroups[0].myStructs[0].len: len %d\n", grp.myBigGroups[0].myStructs[0].len); 
    printf("grp.myBigGroups[0].myStructs[1].ptr: ptr %s\n", grp.myBigGroups[0].myStructs[1].ptr); 
    printf("grp.myBigGroups[0].myStructs[1].len: len %d\n", grp.myBigGroups[0].myStructs[1].len); 
    return 0; 
} 

MyGroupにはMyStructアイテムの「リスト」があります。また、MyStructアイテムがいくつあるかを示す変数もあります。 Vec_MyStuctはMyStructをポイントします。 MyGroupの別のグループがMyBigGroupです。 しかし、ここで心配しているのは、コードが正常に動作していますが、メモリを正しく割り当てているかどうかはわかりません。特にMyBigGroup ..またはMyStructsの複数のエントリを定義するためにこれらの構造体を使用するより効率的な方法はありますか?

ありがとうございました。

+0

1つの提案:ポインタ型定義の 'Vec_'接頭辞は、やや異例の命名規則です。まず、ポインタはベクトルではありません。次に、*通常は*ポインタにtypedefがあっても何の理由もありません(私が必要としたのは、型をパラメータとして受け入れるマクロに渡すだけですが、single_word_typedef型でのみ動作します) 。それでも、最も一般的なコンベンションでは、 'p'の接頭辞(つまり、' pMyGroup'のようなもの)を見ました。そして、両方のシンボルを[単一のステートメント](https://pastebin.com/vshwxyxS)でtypedefすることができることに注意してください: 'typedef struct {int a; int b; }グループ、* pGroup; '。 – Groo

答えて

3
Vec_MyStruct vec = malloc(sizeof(vec)); 

vec[0] = bb1; 
vec[1] = bb2; 

これは間違っています。 1つのポインタのサイズを割り当ててから、2つの構造体をメモリに書き込んでいます。それはmalloc(2 * sizeof(*vec))である必要があります。

ポインタがtypedefであることは、特に、typedefにVec_MyStructのような混乱した名前がある場合は、しばしばconsidered bad styleであることに注意してください。

私の知る限り、あなたのコードの他の部分は正しいものの、いくらか誤りがちな部分もあります。たとえば、文字列を割り当てるコードはサイズをハードコードします。文字列をパラメータとして受け取ったMyStructのフィールドを埋める関数を作ってから、strlenを使ってそのサイズを決定します。

さらに、MyBigGroupには、ローカル変数grp.myBigGroups = &perm;へのポインタを使用しました。この小さな例では動作しますが、コードが大きくなると問題が発生する可能性があります。ポインタが関数の終了後に有効にならず、メモリを試してみると問題が発生します。

+0

ああ..はい、私は1つのベクトルだけに割り当てられたようです!それを指摘してくれてありがとう。ハードコーディングされた文字列は、私が見て、それらの構造体を使用しようとしてくれた簡単な例でした。 – user907810

+0

なぜsizeof(* vec)ですか? – user907810

+0

@ user907810あなたは、ポインタのサイズを割り当てただけでは十分ではありませんでした。 'vec'はポインタで、' * vec'は構造体です。 2つの構造体のサイズが必要なので、 '2 * sizeof(* vec)'です。 – interjay

関連する問題