如何通过引用初始化函数内部的结构数组成员

how to initialize struct array members inside function by reference

我试图制作一个结构数组并初始化结构数组成员,但我不知道如何访问结构成员,我使用了 (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);
}

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

st[t].ch

你在 main 中声明了一个指针

ST* s = NULL;

在 C 中应声明为

struct ST* s = NULL;

因为您声明了类型说明符 struct ST(在 C 中与 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 );

正如@kaylum 所提到的,stinit() 中的局部变量,并且不会更新主函数中的变量 s,因此您可以通过将变量 s 的地址添加到 init() 或者可以只是 return 分配的内存,如下面的代码片段所示。除了使用 bool 作为 return 类型来检查,您还可以使用 ST* 作为 return 类型,如果它是 returns NULL 或内存地址获取内存分配状态。

此外,您必须对结构 typedef 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;
}