【问题标题】:Malloc array of structs in function函数中的结构体的 Malloc 数组
【发布时间】:2019-12-01 12:03:43
【问题描述】:

我正在尝试 malloc 一个结构数组,代码有效,但我收到这些警告,我做错了什么吗?

typedef struct BATTLES_s{
    char day_of_the_week[MAX_ARR];
    char date[MAX_ARR];
    char time[MAX_ARR];
    char team_one_name[MAX_ARR];
    char team_two_name[MAX_ARR];
    int  team_one_score;
    int  team_two_score;
    int  peers;
}BATTLES_s;
int main()
{
 int total_number_of_battles;

 count_number_of_battles(&total_number_of_battles); /* this value is 182 */

 BATTLES_s *battles = malloc(total_number_of_battles * sizeof(*battles));
 malloc_battle_struct(total_number_of_battles,battles);

 print_result();
}
void malloc_battle_struct(int total_number_of_battles,BATTLES_s battles[MAX_STRUCT_ARRAY]){
 int i;
 for (i = 0; i <= total_number_of_battles; i++)
 {
    *battles[i].date = malloc( sizeof(char) * MAX_ARR );
    *battles[i].day_of_the_week = malloc( sizeof(char) * MAX_ARR );
    *battles[i].team_one_name = malloc( sizeof(int) * MAX_ARR );
    *battles[i].team_two_name = malloc( sizeof(char) * MAX_ARR );
    *battles[i].time = malloc( sizeof(char) * MAX_ARR );
 }
}

警告:从 'void *' 赋值给 'char' 使指针从没有强制转换的整数 [-Wint-conversion] *battles[i].date = malloc( sizeof(char) * MAX_ARR );

警告:从 'void *' 赋值给 'char' 使指针从没有强制转换的整数 [-Wint-conversion] *battles[i].day_of_the_week = malloc( sizeof(char) * MAX_ARR );

警告:从 'void *' 赋值给 'char' 使指针从没有强制转换的整数 [-Wint-conversion] *battles[i].team_one_name = malloc( sizeof(int) * MAX_ARR );

警告:从 'void *' 赋值给 'char' 使指针从没有强制转换的整数 [-Wint-conversion] *battles[i].team_two_name = malloc( sizeof(char) * MAX_ARR );

警告:从 'void *' 赋值给 'char' 使指针从没有强制转换的整数 [-Wint-conversion] *battles[i].time = malloc( sizeof(char) * MAX_ARR );

【问题讨论】:

  • 在这种情况下“工作”是什么意思?你在看哪本C书?分配数组是不可能的,你已经分配了它们,这里的一切都是错误的。事实上,您可以完全删除 malloc_battle_struct 并调用它。
  • 我稍后会使用数组来存储姓名和分数,并且它可以工作。但我认为你是对的,我这里根本不需要“malloc_battle_struct”..

标签: c arrays struct


【解决方案1】:

这段代码完全被破坏了:

*battles[i].date = malloc( sizeof(char) * MAX_ARR );

正如编译器告诉你的那样,你正在分配一个不属于它的指针。 date 是一个字符数组,你不能在那里存储malloc 的结果。就好像你认为你在动态分配字符串,而你的结构中已经有存储字符串的空间。

【讨论】:

  • 所以我做完之后什么都不需要做:"BATTLES_s *battles = malloc(total_number_of_battles * sizeof(*battles));"?
  • @MetalMike:每个结构都包含存储空间,不包含任何指针。所以是的,你的单身malloc() 为所有内容分配空间。
【解决方案2】:

静态和动态分配的概念似乎存在问题。您已经在结构中声明了各种静态分配且不需要 malloc 的数组。

【讨论】:

    【解决方案3】:

    如果你想在你的结构中拥有动态字符串字段,你应该将它们声明为字符指针。我用 cmets 更正了你的代码。

    malloc 函数返回void*,因此您应该将返回的值转换为您动态分配的类型。

    malloc 函数从堆中分配区域。因此,您有责任在完成后使用 free 函数释放该区域。

    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAX_ARR 100
    
    typedef struct BATTLES_s{
        char* day_of_the_week;
        char* date;
        char* time;
        char* team_one_name;
        char* team_two_name;
        int  team_one_score;
        int  team_two_score;
        int  peers;
    }BATTLES_s;
    
    void malloc_battle_struct(int total_number_of_battles, BATTLES_s *battles)
    {
      
        // it should be less than '<' total_number_of_battles otherwise you get 
        //segmentation fault
        for (int i = 0; i < total_number_of_battles; i++) 
        {
            // *battles[i] is incorrect battles[i] already dereferencing ith pointer
            battles[i].date = (char*) malloc( sizeof(char) * MAX_ARR );
            battles[i].day_of_the_week = (char*)malloc( sizeof(char) * MAX_ARR );
            battles[i].team_one_name = (char*)malloc( sizeof(char) * MAX_ARR );
            battles[i].team_two_name = (char*)malloc( sizeof(char) * MAX_ARR );
            battles[i].time = (char*)malloc( sizeof(char) * MAX_ARR );
        }
    }
    
    int main()
    {
        int total_number_of_battles = 182; // I assume it is returned from your 
    //count_number_of_battles function
        BATTLES_s *battles = (BATTLES_s*) malloc(total_number_of_battles * 
        sizeof(BATTLES_s));
        malloc_battle_struct(total_number_of_battles, battles);
    
        return 0;
    }
    

    【讨论】:

      【解决方案4】:
      char date[MAX_ARR];
      

      通过将其写入结构中,您为 BSS 中的日期进行了静态内存分配 (MAX_ARR),如果您想动态分配内存,则需要使用指针:

      char *date;
      date = (char*)malloc(sizeof(char) * MAX_ARR); 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-24
        • 1970-01-01
        • 2015-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多