【发布时间】:2021-09-13 16:33:02
【问题描述】:
我的查询相对简单。存在一个名为war_name 的结构,其定义如下:
struct war_name
{
char name[40];
char location[20];
int deaths;
int injuries;
char victor_name[20];
char loser_name[20];
};
我创建的上述结构的输入函数如下:
void enter_details(struct war_name *d)
{
printf("\n________________________________________\n");
printf("Enter the name of the battle: ");
fgets(d->name,sizeof(d->name),stdin);
printf("Enter the location: ");
fgets(d->location,sizeof(d->location),stdin);
printf("Enter the number of deaths: ");
scanf("%d",&d->deaths);
printf("Enter the number of injuries: ");
scanf("%d",&d->injuries);
printf("Enter the victor's name: ");
fgets(d->victor_name,sizeof(d->victor_name),stdin);
printf("Enter the defeated party's name: ");
fgets(d->loser_name,sizeof(d->loser_name),stdin);
printf("\n________________________________________\n");
}
现在,main() 部分具有以下组成:
int main(void)
{
int n;
printf("How many war details do you wish to input?\n");
scanf("%d",&n);
struct war_name *ptr=(struct war_name *)malloc(n*sizeof(struct war_name));
if(ptr==NULL)
printf("\nInitialization unsuccessful\n");
for(int i=0;i<n;i++)
{
enter_details(ptr[i]);
}
exit(EXIT_SUCCESS);
}
此时有两个查询到达。
首先,当我将ptr 值直接传递给enter_details() 函数时,为什么我的编译器会吐出错误cannot convert 'war_name' to 'war_name*' for argument '1' to 'void enter_details(war_name*)'?为了验证仅将ptr[i] 传递给函数的假设会发送第 ith 结构的位置(这是函数所要求的),我直接打印了 ptr 的值,然后 lo 和看哪,该结构的地址被打印出来了。为什么尽管有这种发展,编译器会吐出错误并要求我使用 & 运算符传递结构的地址,因为 ptr[i] 本身持有 ith 的值结构变量?
其次,关于ptr指针(指向结构war_name)的概念和malloc()的用法,是我用上述函数授予的可用空间初始化ptr的方式可以接受吗?为了参考起见,请注意,我所关注的书首先创建了一个指向 war_name 结构的数组指针,然后将所述结构的地址传递给函数?我的方法合理吗?考虑到我的方法节省了宝贵的内存,是否有必要构思一个指向上述结构的指针数组,然后将每个结构变量的地址传递给enter_details() 函数?
【问题讨论】:
-
ptr[i]返回数组中第 i 个元素的值,而不是其地址 -
展示比讲述要好。 “数组指针” 有点模棱两可,而且由于您(据您自己承认)仍在学习,因此您可能歪曲了您的教科书。
-
"将 ptr[i] 传递给函数会发送第 i 个结构的位置" ---> 不,
ptr[i]不是 第 i 个结构的位置。ptr[i]是第 i 个结构。&ptr[i]是第 i 个结构的位置。 -
错误:
fgets()将在scanf("%d",...);之后读取剩余的'\n'。建议放弃scanf()使用。 -
您可以使用
fgets后跟sscanf来读取数字。另一个错误是fgets将在字符串中存储换行符,因此如果用户输入bob作为他们的名字,则结构中的name数组将包含bob\n。有关如何删除换行符的建议,请参阅 stackoverflow.com/questions/2693776。