1

我试图创建一个结构数组并初始化结构数组成员,但我不知道如何访问结构成员,我使用了(st->ch)[t] = 'c';和其他类似的语法,但我没有成功。

此致。

struct ST
{
    char ch;
};

bool init(ST* st, int num)
{
    st = (ST*)malloc(num * sizeof(ST));
    if (st == NULL) return false;

    for (int t = 0; t < num; t++) (st->ch)[t] = 'c';

    return true;
}

int main()
{
    ST* s = NULL;
    init(s, 2);

    putchar(s[1].ch);
}
4

3 回答 3

1

您可以使用以下方法访问结构成员:

st[t].ch
于 2021-08-10T11:08:39.467 回答
1

正如@kaylum 提到的那样,它st是一个局部变量,init()并且不会更新s主函数中的变量,因此另一种选择是您可以将变量的地址传递s给,init()也可以只返回分配的内存,如代码所示下面的片段。除了使用boolas 返回类型来检查,您可以使用ST*as 返回类型以及它是否返回NULL或 mem 地址来获取 mem 分配状态。

此外,您必须对结构进行 typedeftypedef struct ST ST;才能直接使用该类型,ST否则您必须坚持使用struct ST

typedef struct ST
{
    char ch;
}ST;

ST* init(int num)
{
  ST *st;

  // Create num elems of ST type
  st = (ST*)malloc(num * sizeof(ST));

  // return NULL is st unintialised
  if (st == NULL) {
    return st;
  }

  // Assign ch member variable of the 't'th st element wit 'c'
  for (int t = 0; t < num; t++) {
    st[t].ch = 'c';
  }

  return st;
}

int main()
{
  ST* s;

  // creates an array of size two of type st
  s = init(2);

  putchar(s[1].ch);

  return 0;
}

于 2021-08-10T11:30:14.563 回答
1

您在 main 中声明了一个指针

ST* s = NULL;

在 C 中应声明为

struct ST* s = NULL;

因为您声明了类型说明符struct ST(在 C 中与 just 不同ST

struct ST
{
    char ch;
};

你要在一个函数中改变。为此,您必须通过引用将指针传递给函数。那就是函数声明至少看起来像

bool init( struct ST **st, int num );

并且该函数被称为

init( &s, 2);

if ( s ) putchar( s[1].ch );

函数本身可以定义为

bool init( struct ST **st, int num )
{
    *st = malloc( num * sizeof( struct ST ) );

    if ( *st )
    {
        for ( int i = 0; i < num; i++) ( *st )[i].ch = 'c';
    }

    return *st != NULL;
}

如果您使用的是 C++ 编译器,请替换此语句

    *st = malloc( num * sizeof( struct ST ) );

为了

    *st = ( struct ST * )malloc( num * sizeof( struct ST ) );

当不需要结构数组时,您应该释放数组占用的内存,例如

free( s );
于 2021-08-10T11:25:01.317 回答