如何解决如何在函数中重新分配结构数组
我正在尝试为我的学校项目分配一个动态的 Country 对象数组。我在 main()
函数中对数组进行了 malloc 处理,并在 add_country()
函数中重新分配了它。但它似乎给了我重新分配无效的 ponter 错误。有人可以帮忙吗?这是最小的可重现代码。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int count = 0;
typedef struct test_Country
{
char name[20];
int gold;
int silver;
int bronze;
} test_Country;
test_Country *addtest_Country(test_Country test_Country_obj,test_Country*array)
{
int flag = 0;
printf("%s\n","before realloc");
test_Country *new_array;
new_array = realloc(array,sizeof(test_Country *) * (count + 1));
printf("%s\n","after realloc");
//array[count].name = (char *)malloc(strlen(test_Country_obj.name) + 1);
if (count == 0)
{
strcpy(new_array[0].name,test_Country_obj.name);
}
else
{
for (int i = 0; i < count; i++)
{
if (strcasecmp(new_array[i].name,test_Country_obj.name) == 0)
{
printf("%s","test_Country already added\n");
flag = 1;
break;
}
}
}
if (flag == 0)
{
strcpy(new_array[count].name,test_Country_obj.name);
test_Country_obj.gold = 0;
test_Country_obj.silver = 0;
test_Country_obj.bronze = 0;
new_array[count] = test_Country_obj;
count = count + 1;
}
flag = 0;
return new_array;
}
int main()
{
char choice;
test_Country *array = malloc(sizeof(test_Country));
test_Country test_Country_obj;
printf("%s","Enter your choice : ");
scanf("%s",&choice);
//fgets(ptr,80,stdin);
//sscanf(ptr,"%c %s %d %d %d",&choice,test_Country_obj.name,&test_Country_obj.gold,&test_Country_obj.silver,&test_Country_obj.bronze);
//printf("%s",&choice);
while (choice != 'E')
{
printf("%s","Enter test_Country name : ");
scanf("%s",test_Country_obj.name);
array = addtest_Country(test_Country_obj,array);
//printf("%d%s",count,"is count");
printf("%s","Enter your choice : ");
scanf("%s",&choice);
}
}
我似乎无法理解出了什么问题。
解决方法
char choice;
scanf("%s",&choice);
不好。 choice
只能容纳一个字符,因此它只能容纳最多零个字符的字符串。 (一个字符的房间用于终止空字符)。尝试存储长度超过零字符的字符串会导致危险的超出范围写入,并且可能会破坏周围的数据。
为了避免超出范围的写入,您应该分配足够的元素并指定要读取的最大长度。最大长度应为缓冲区大小减一以终止空字符。
char choice[16]; /* allocate enough elements */
scanf("%15s",choice); /* specify the maximum length */
之后,choice
和while
中的switch
应该替换成choice[0]
,根据第一个字符判断。另一种方法是使用 strcmp()
检查整个字符串。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。