首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态访问C结构

问动态访问C结构
EN

Stack Overflow用户
提问于 2013-12-17 05:58:28
回答 2查看 105关注 0票数 1

我正在尝试为C中的结构构建一个类似构造函数的函数。我最擅长使用围绕面向对象特性构建的语言,而将面向对象特性添加到基本的语言中并不是我的强项。然而,不幸的是,对于这个项目,我不得不使用C的一个变体。

其思想是为需要初始化的结构中的每个变量构建一个函数,并为结构的名称使用一个' name‘参数。

最大的问题是,我需要使用的C语言的变体在功能上非常有限。在其他方面,它似乎没有动态内存分配。

目标代码应该是这样的:

代码语言:javascript
复制
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中如何动态引用结构呢?

EN

回答 2

Stack Overflow用户

发布于 2013-12-17 06:00:50

有两个选择:

  1. 通过引用struct TheStruct方法传递newStruct方法
  2. 返回一个堆分配的结构(指向来自newStruct的struct TheStruct的指针),稍后您必须使用free

将其删除

方法可能是这样的:

代码语言:javascript
复制
typedef struct {
    int a;
    string b;
} TheStruct;

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

或

代码语言:javascript
复制
TheStruct* newStruct(string name, int a, string b){
    TheStruct *res = malloc(sizeof(TheStruct));
    res->a = a;
    res->b = b;
    return res;
}

你可以看看这个非常好的教程:Pointers in C++。是针对C++的,但基本原理基本相同。

票数 2
EN

Stack Overflow用户

发布于 2013-12-17 06:06:17

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

代码语言:javascript
复制
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。)

代码语言:javascript
复制
TheStruct s1, *s2;
s2 = malloc( sizeof( TheStruct ) );
newStruct( &s1, a, b );
newStruct( s2, a, b );
// do stuff
free( s2 );

在第二个版本中,它将如下所示:

代码语言:javascript
复制
TheStruct *s3 = newStruct( a, b );
// do stuff
free( s3 );
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20621771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档