2017-08-02 27 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

一個建議:指針typedefs的'Vec_'前綴是一個相當不尋常的命名約定。首先,指針不是矢量。接下來,*通常*沒有任何理由,即使有一個指針typedef(我只需要它是將它傳遞給一個接受類型作爲參數的宏,但只適用於single_word_typedef類型) 。即使這樣,我看到它最常見的約定是以「p」(即類似於「pMyGroup」)的前綴。並且請注意,您可以在[單個語句](https://pastebin.com/vshwxyxS)中輸入兩個符號的類型:'typedef struct {int a; int b; } Group,* pGroup;'。 – Groo

回答

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

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

這是錯誤的。您正在分配單個指針的大小,然後將兩個結構體寫入內存中。它應該是malloc(2 * sizeof(*vec))

注意typedef荷蘭國際集團的指針經常considered bad style,特別是當有typedef的一個混亂的名稱,如Vec_MyStruct

據我所見,你的代碼的其他部分是正確的,但有些有些容易出錯。例如,分配字符串的代碼對尺寸進行硬編碼。我會做一個函數來填充接收字符串作爲參數的MyStruct的字段,然後使用strlen來確定它的大小。

此外,在MyBigGroup中,您使用了一個指向局部變量grp.myBigGroups = &perm;的指針。這將在這個小例子中起作用,但是可能導致代碼較大的問題 - 在函數退出後指針將無效,並且如果嘗試記憶,則會導致問題。

+0

啊..是的,我似乎只分配了一個矢量!感謝您指出了這一點。硬編碼的字符串只是我熟知的一個快速示例,並嘗試使用這些結構。 – user907810

+0

以及爲什麼sizeof(* vec)? – user907810

+0

@ user907810你甚至沒有足夠的分配 - 你只是分配一個指針的大小。 'vec'是一個指針,'* vec'是一個結構。你需要兩個結構體的大小,所以'2 * sizeof(* vec)'。 – interjay