使用带索引的结构来创建向量

时间:2017-08-02 08:44:20

标签: c pointers struct

我在一段代码中遇到了类似的结构。在尝试使用这些时,我不知为何被卡住了。这是我根据我遇到的结构写的。

#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有一个&#34;列表&#34; MyStruct项目。它还有一个变量,告诉我有多少MyStruct项目存在。 Vec_MyStuct只指向MyStruct。 MyGroup的另一个分组是MyBigGroup。 但是我担心的是虽然代码运行得很好,但我不确定我是否正确分配内存。尤其是MyBigGroup ..或者是否有更有效的方法来使用这些结构来定义MyStructs的多个条目?

感谢。

1 个答案:

答案 0 :(得分: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;的指针。这将在这个小例子中起作用,但可能导致更大代码中的问题 - 在函数退出后指针不会有效,如果你尝试free内存,它将导致问题。