在动态分配的结构数组中获取和设置值

时间:2016-12-11 21:36:40

标签: c struct

我是编程C的初学者,在创建动态结构数组时需要帮助获取和设置值。

我有这个结构例如:

struct opt{
    int size;
    Element* elements;
    CopyFunction copyElement;
};
typedef struct opt * Popt;

我想使用动态分配并使用malloc为5个struct opt类型的结构分配内存;我用过这一行:

Popt opt_t = (Popt)malloc(5*sizeof(struct opt));

我想在这些结构中获取和设置值。如果我像OOP一样思考,我想得到这样的值:

  

opt_t [2] .size,opt_t [3] .elements,opt_t [3] .copyElement

我怎么能用C做呢?我尝试使用以下行并且看起来很糟糕(我的记忆充满了垃圾)。

*((&(opt_t->size)+(2*sizeof(struct opt))))
*((&(opt_t->elements)+(3*sizeof(struct opt))))
*((&(opt_t->copyElement)+(3*sizeof(struct opt))))

2 个答案:

答案 0 :(得分:2)

  

如果我像OOP一样考虑这个问题,我想得到这些价值观:

opt_t[2].size, opt_t[3].elements, opt_t[3].copyElement
     

如何使用C?

喜欢' OOP':

opt_t[2].size
opt_t[3].elements
opt_t[3].copyElement
你尝试过吗?什么地方出了错?您不需要按照正常C中对象的大小来缩放指针,因此像*((&(opt_t->size)+(2*sizeof(struct opt))))这样的符号完全朝错误的方向发展。可以剖析它们正在做的事情,但它不是预期的,并通过访问分配范围之外的内存来调用未定义的行为。 (如果你真的想知道他们做了什么,请发表评论并进行阐述,但你应该在评论中解释他们的想法。)

如果您愿意,可以使用:

(*(opt_t + 3)).copyElement

索引指针,取消引用它,然后应用成员访问权限。但是使用opt_t[3].copyElement代替它更简单。

另外,正如我在two comments中所述:

  1. 请注意,_t后缀最常用于表示类型名称(从C标准中考虑size_tuint8_twchar_t等,还有更多来自POSIX)。最好不要在变量上使用后缀;它有可能混淆阅读代码的人。它实际上并不是错的;它只是向那些看过很多C代码的人发错了信息。

  2. 另请参阅Is it a good idea to typedef pointers,简明扼要的答案是'否' (或者通常没有')。正如对这个问题的回答所证明的那样,这种typedef会导致混淆。

  3. suggested中,问题中的内存分配可能存在一些混淆。既然它说:

      

    我想使用动态分配并使用malloc来分配5个struct opt类型结构的内存...

    并迅速着手展示一种可接受的做法,尽管有cast许多人鄙视但我并不担心我附近的任何地方似乎让其他人感到不安,我没有必要进一步评论内存分配。我悄悄地假设当代码完成分配的空间时会有一个调用free(opt_t)或等效的地方 - 并且如果为elements成员分配了空间,那么该空间将首先被释放。 / p>

答案 1 :(得分:0)

你需要一个双指针:

Popt *opt_t;

//do error checking of the return value of malloc
opt_t = malloc(5 * sizeof(opt_t)); //5 pointers
for(i = 0; i < 5; i++){
    opt_t[i] = malloc(sizeof(opt)); //each struct
}

最终免费记忆:

for(i = 0; i < 5; i++){
    free(opt_t[i]);
}
free(opt_t);