向C中的函数发送结构指针
我不喜欢这个,但是我有一个结构,里面有将近45个成员;都是字符或字符数组。也就是说,我需要优化初始化每个结构的方式。通常,我会将整个对象传递到init_struct()函数中,但我觉得这不是最好的方法 我如何创建并使用指向结构的指针来实现这一点 旧方法看起来像这样:向C中的函数发送结构指针,c,function,pointers,struct,C,Function,Pointers,Struct,我不喜欢这个,但是我有一个结构,里面有将近45个成员;都是字符或字符数组。也就是说,我需要优化初始化每个结构的方式。通常,我会将整个对象传递到init_struct()函数中,但我觉得这不是最好的方法 我如何创建并使用指向结构的指针来实现这一点 旧方法看起来像这样: void init_struct(struct general){ ...initialize members... } int main(){ struct general[10]; for(int i = 0 ; i
void init_struct(struct general){
...initialize members...
}
int main(){
struct general[10];
for(int i = 0 ; i < 10 ; ++i){
init_struct(general[i];
}
}
void init_struct(struct general mygeneralstruct){}
void init_struct(general mygeneralstruct){}
要传递指向数组元素的指针,只需在参数前面加上&,确保正确声明函数:
void init_struct(HUDL* pGeneral){
if ( pGeneral != NULL ) {
//This will ensure the entire structure contains '0'
memset(pGeneral, 0, sizeof(HUDL));
...initialize members...
}
}
int main(){
HUDL general[10];
for( int i=0; i<(sizeof(general) / sizeof(general[0])); i++ ) {
init_struct(&general[i]);
}
}
void init_struct(HUDL*pGeneral){
if(pGeneral!=NULL){
//这将确保整个结构包含“0”
memset(pGeneral,0,sizeof(HUDL));
…初始化成员。。。
}
}
int main(){
HUDL通用[10];
对于(inti=0;i来说,一种稍微干净、更好的方法是使用构造函数和析构函数来动态地为结构分配内存,并在使用后释放内存
static void HUDL_destroy(HUDL* ptr)
{
if(ptr)
{
//...any other clean up that needs to be done goes here..
free(ptr);
}
}
static HUDL* HUDL_create()
{
HUDL* ptr = malloc(sizeof(HUDL));
if(!ptr)
return NULL;
//do initialization bits...
init_struct(ptr);
return ptr;
}
int main()
{
//allocate and initialise structure
HUDL *general = HUDL_create();
//do stuff...
//free structure after use
HUDL_destroy(general);
}
在您的案例中可能需要一个指针数组,因此相应地修改main()
int main()
{
//we need an array of structure pointers
HUDL* general[SIZE];
//allocate and initialize structure
for(int i=0; i<SIZE; i++)
general[i] = HUDL_create();
//do stuff...
//free structure after use
for(i=0; i<SIZE; i++)
HUDL_destroy( general[i] );
}
intmain()
{
//我们需要一个结构指针数组
HUDL*一般[尺寸];
//分配和初始化结构
对于(inti=0;i,您的代码有几处错误。
首先,您的函数定义是错误的,因为您忽略了参数名。您的函数定义应该如下所示:
void init_struct(struct general){
...initialize members...
}
int main(){
struct general[10];
for(int i = 0 ; i < 10 ; ++i){
init_struct(general[i];
}
}
void init_struct(struct general mygeneralstruct){}
void init_struct(general mygeneralstruct){}
或者,可以使用typedef为结构使用别名,如下所示:
typedef struct {
int a;
} general;
在这种情况下,函数声明可能如下所示:
void init_struct(struct general){
...initialize members...
}
int main(){
struct general[10];
for(int i = 0 ; i < 10 ; ++i){
init_struct(general[i];
}
}
void init_struct(struct general mygeneralstruct){}
void init_struct(general mygeneralstruct){}
声明结构数组时,您遇到同样的问题。您省略了变量的名称
struct general[10];
应该是
struct general mygeneralstruct[10]
或
常规mygeneralstruct[10]
(typedef)
最后,不能通过将每个结构的值传递给函数来更改结构数组,而是需要传递每个结构的地址。
然后,您的函数声明应该是(使用typedef):
循环中的代码:
init_struct(&mygeneralstruct[i]);
阅读几乎所有内容。他们应该有关于如何使用指针的章节,包括指向结构的指针。请参阅Splaten的答案,并注意指针(*
)的使用和(&
)运算符的地址。阅读本书。您可以使用旧函数,即void init_struct(struct general){
是错误的,不可能是被使用的。您命名和组成员的方式表明可能有一些较小的结构试图退出。从一些较小的结构开始,然后使用它们来构建下一个级别是很正常的。除非ydln
和gnls
是问题域中众所周知的术语,我会尝试使用一些更易于阅读的名称。阅读有关指向结构的指针和指针数组的内容。在我看来,似乎有一个typedef
是的,有,但它没有被使用。不能在数组声明中使用非常量局部变量num。最好使用类而不是结构来重写该示例。I我敢打赌是的。但只有在我们有C类的情况下。谢谢你指出了另一个问题…我已经将变量更改为预定义值。