如何通过引用初始化函数内部的结构数组成员
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 所提到的,st
是 init()
中的局部变量,并且不会更新主函数中的变量 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;
}
我试图制作一个结构数组并初始化结构数组成员,但我不知道如何访问结构成员,我使用了 (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 所提到的,st
是 init()
中的局部变量,并且不会更新主函数中的变量 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;
}