如何在函数中重新分配结构数组
Posted
技术标签:
【中文标题】如何在函数中重新分配结构数组【英文标题】:How do I reallocate a array of structures in a function 【发布时间】:2021-07-15 14:06:20 【问题描述】:我正在尝试为我的学校项目分配 Country 对象的动态数组。我在main()
函数中对数组进行了malloc,并且我在add_country()
函数中重新分配了它。但它似乎给了我 realloc 无效的 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);
我似乎无法理解哪里出了问题。
【问题讨论】:
它似乎给了我 realloc 无效的 ponter 错误。它是什么”?请解释该错误的来源并在帖子中逐字提供。另外,请提供完整的代码minimal reproducible example。 我遇到了同样的错误。但我似乎无法理解是什么原因造成的。我在这里放了导致问题的代码。因此,当我选择“A”时,该函数转到 add_country() 函数。每次添加新国家/地区时,我都会尝试增加“数组”的大小。 country_obj.name 获取 Country 的名称作为输入。 我添加了最小可重现代码。 【参考方案1】:char choice;
scanf("%s", &choice);
不好。 choice
只能容纳一个字符,因此它只能容纳最多零个字符的字符串。 (单字符房间用于终止空字符)。尝试存储长度超过零字符的字符串会导致危险的超出范围写入,并且可能会破坏周围的数据。
为避免超出范围写入,您应该分配足够的元素并指定要读取的最大长度。最大长度应该是缓冲区大小减一以终止空字符。
char choice[16]; /* allocate enough elements */
scanf("%15s", choice); /* specify the maximum length */
之后将while
和switch
中的choice
替换为choice[0]
以第一个字符判断。另一种方法是使用strcmp()
来检查整个字符串。
【讨论】:
感谢您的建议,但我不认为这会导致问题,因为程序转到 add_country 函数和 realloc 部分并中断。 @av1028 调用未定义的行为并不总是会导致崩溃。 我不明白。你能解释一下吗。我是编程新手。我已经添加了可复制的代码。另外,我的系统可能有问题吗?以上是关于如何在函数中重新分配结构数组的主要内容,如果未能解决你的问题,请参考以下文章