动态访问C结构

时间:2013-12-16 21:58:28

标签: c dynamic struct

我正在尝试为C语言中的结构构建类似构造函数的函数。我最好使用围绕面向对象特性构建的语言,并且将面向对象的特性添加到一个简单的语言中并不是我的强项。不幸的是,对于这个项目,我被迫使用C的变种。

我们的想法是为需要初始化的struct中的每个变量构建一个带有参数的函数,以及结构名称的'name'参数。

最大的问题是C I需要使用的变化在功能上非常有限。除其他外,它似乎没有动态内存分配。

目标代码是这样的:

typedef struct {
    int a;
    string b;
} TheStruct;

void newStruct(string name, int a, string b){
    TheStruct name;
    name.a = a;
    name.b = b;
}

这不起作用,因为实例化的结构被称为'name'而不是name变量的值。如果不使用C中没有的高级特性变量变量,如何在C中以这种方式动态引用结构?

2 个答案:

答案 0 :(得分:3)

两种选择:

  1. 通过引用传递struct TheStruct newStruct方法
  2. 返回一个堆分配的结构(指向struct TheStruct的{​​{1}}的指针),稍后您将不得不使用newStruct删除
  3. 方法可能是这样的:

    free

    typedef struct {
        int a;
        string b;
    } TheStruct;
    
    void newStruct(TheStruct* st, string name, int a, string b){
        st->a = a;
        st->b = b;
    }
    

    你可以看看这个非常好的教程:Pointers in C++。适用于C ++,但基础知识基本相同。

答案 1 :(得分:0)

您希望通过引用传递TheStruct或返回指向新结构的指针。

void newStruct( TheStruct* s, int a, string b )
{
   if( !s )
      s = malloc( sizeof( TheStruct ) );

   s->a = a;
   s->b = b;
}

//or

TheStruct* newStruct( int a, string b )
{
    TheStruct* s = malloc( sizeof( TheStruct ) );
    s->a = a;
    s->b = b;
    return s;
}

注意:使用第二个版本时,您必须记住清理内存,因为它是在堆上创建的。使用第一个版本,可以在堆栈或堆上创建TheStruct。 (我假设a和b已定义。)

TheStruct s1, *s2;
s2 = malloc( sizeof( TheStruct ) );
newStruct( &s1, a, b );
newStruct( s2, a, b );
// do stuff
free( s2 );

在第二个版本中,它看起来像:

TheStruct *s3 = newStruct( a, b );
// do stuff
free( s3 );