微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在函数中重新分配结构数组

如何解决如何在函数中重新分配结构数组

我正在尝试为我的学校项目分配一个动态的 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 */

之后,choicewhile中的switch应该替换成choice[0],根据第一个字符判断。另一种方法是使用 strcmp() 检查整个字符串。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。