繁体   English   中英

Malloc 函数中的结构数组

[英]Malloc array of structs in function

我正在尝试 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 );

这段代码完全被破坏了:

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

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

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

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

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;
}
char date[MAX_ARR];

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM