我正在尝试为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中以这种方式动态引用结构?
答案 0 :(得分:3)
两种选择:
struct TheStruct
newStruct
方法struct TheStruct
的{{1}}的指针),稍后您将不得不使用newStruct
删除方法可能是这样的:
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 );