C 我无法使用->
我对一个函数有一个小问题,它接收一个结构数组作为参数,这个问题发生在尝试使用操作符->访问数组元素时C 我无法使用->,c,struct,C,Struct,我对一个函数有一个小问题,它接收一个结构数组作为参数,这个问题发生在尝试使用操作符->访问数组元素时 #include <stdio.h> typedef struct{ int order; }record; void entry(record*reg, size_t num_regs); int main(void){ record reg[10]; entry(reg, sizeof reg / sizeof reg[0]); retur
#include <stdio.h>
typedef struct{
int order;
}record;
void entry(record*reg, size_t num_regs);
int main(void){
record reg[10];
entry(reg, sizeof reg / sizeof reg[0]);
return 0;
}
void entry(record*reg, size_t num_regs){
size_t i;
for (i = 0; i < num_regs; i++){
reg[i]->order = i;
printf("\n order = %d", reg[i]->order);
}
}
因为它抛出了这个错误以及如何修复它?当您使用[]作为指针时,您已经有了一个数据,所以请使用。而不是->
reg[i].order = i;
printf参数也是如此。当指针使用[]时,您已经有了数据,所以请使用。而不是->
reg[i].order = i;
printf参数也是如此。我像这样尝试了你的代码,整个数组的打印结果完全正确:
for (i = 0; i < num_regs; i++){
reg->order = i;
printf("\n order = %d", reg->order);
}
我像这样尝试了你的代码,整个数组打印的都是正确的:
for (i = 0; i < num_regs; i++){
reg->order = i;
printf("\n order = %d", reg->order);
}
您需要理解->和之间的区别。访问结构内部数据时的运算符 s、 a仅用于s是结构体且a是s的成员时 sp->a实际上只是*sp.a的简写。当sp是指向struct的指针时,我们要在一个步骤中解除对该指针的引用并访问该结构的数据。 正如VolAnd所说,您使用的是reg[i]->order,但实际上应该使用reg[i].order 如果还不清楚的话 使用entry函数,您将传入一个名为reg的10个记录结构数组。您可以通过传递一个指向数组基址的指针来实现这一点,因此函数接受record*类型的指针
数组的元素是结构,而不是结构指针,因此您可以使用reg[i].order,而不是reg[i]->order来访问它们。您需要理解->和之间的区别。访问结构内部数据时的运算符 s、 a仅用于s是结构体且a是s的成员时 sp->a实际上只是*sp.a的简写。当sp是指向struct的指针时,我们要在一个步骤中解除对该指针的引用并访问该结构的数据。 正如VolAnd所说,您使用的是reg[i]->order,但实际上应该使用reg[i].order 如果还不清楚的话 使用entry函数,您将传入一个名为reg的10个记录结构数组。您可以通过传递一个指向数组基址的指针来实现这一点,因此函数接受record*类型的指针
数组的元素是结构,而不是结构指针,因此可以使用reg[i].order,而不是reg[i]->order来访问它们。这里传递数组的地址,存储/收集在指针中。 由于指针指向数组,如果使用->运算符访问结构元素,它将把数组视为指针,并将错误作为错误抛出:无效类型参数为-->have-record 所以你必须使用。操作员安装->操作员
for (i = 0; i < num_regs; i++)
{
reg[i].order = i;
printf("\n order = %d", reg[i].order);
}
在这里,您传递的是数组的地址,存储/收集的是指针。 由于指针指向数组,如果使用->运算符访问结构元素,它将把数组视为指针,并将错误作为错误抛出:无效类型参数为-->have-record 所以你必须使用。操作员安装->操作员
for (i = 0; i < num_regs; i++)
{
reg[i].order = i;
printf("\n order = %d", reg[i].order);
}
问题不在这段代码中,您如何调用entry?我们需要看到void entry的调用。。有任何帮助,但问题就在这里,因为编译器抱怨您传递的是registro*而不是registro**,可能您传递的是寄存器[0],而不是®isters[0],或者您传递的是registro[NUM],而不是registro*[NUM]。我再次编辑了添加完整程序的问题,问题不在这段代码中。一旦根据下面Voland的回答修复了访问器语法,此代码将按预期编译和运行。发布显示真实问题的真实代码。它不会使用->编译,因为->的使用是不正确的。你为什么坚持使用它?VolAnd和Fisher都为您提供了正确的代码版本。问题不在这段代码中,您如何调用entry?我们需要查看void entry的调用。。有任何帮助,但问题就在这里,因为编译器抱怨您传递的是registro*而不是registro**,可能您传递的是寄存器[0],而不是®isters[0],或者您传递的是registro[NUM],而不是registro*[NUM]。我再次编辑了添加完整程序的问题,问题不在这段代码中。一旦根据下面Voland的回答修复了访问器语法,此代码将按预期编译和运行。发布显示真实问题的真实代码。它不会使用->编译,因为->的使用是不正确的。你为什么坚持使用它?VolAnd和Fisher都为您提供了正确的代码版本。因为它不使用运算符->因为它不使用运算符->删除reg的索引,如下所示:reg->order=i;我编辑了我的回答,我认为这不正确。最后,我们希望访问reg[i].order,它也可以写为*reg+i.order,因为reg是指向数组基的指针。访问reg->order实际上就是访问*reg.order,它只是数组中的第一个结构。如果你
运行这段代码,你会发现你只正确初始化了第一个结构的内容,而其余的包含垃圾;我编辑了我的回答,我认为这不正确。最后,我们希望访问reg[i].order,它也可以写为*reg+i.order,因为reg是指向数组基的指针。访问reg->order实际上就是访问*reg.order,它只是数组中的第一个结构。如果您运行这段代码,您会发现您只正确初始化了第一个结构的内容,而其余的包含垃圾。感谢您的详细解释。感谢您的详细解释。