C语言 函数中结构的 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-转换] *battles[i].date = malloc( sizeof(char( * MAX_ARR (;

警告:从"void *"赋值到"char"会使指针中的整数没有强制转换 [-Wint-转换] *战斗[i].day_of_the_week = malloc( sizeof(char( * MAX_ARR (;

警告:从"void *"赋值到"char"会使指针中的整数没有强制转换 [-Wint-转换] *战斗[i].team_one_name = malloc( sizeof(int( * MAX_ARR (;

警告:从"void *"赋值到"char"会使指针中的整数没有强制转换 [-Wint-转换] *战斗[i].team_two_name = malloc( sizeof(char( * MAX_ARR (;

警告:从"void *"赋值到"char"会使指针中的整数没有强制转换 [-Wint-转换] *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中为date进行了静态内存分配(MAX_ARR(,如果要动态分配内存,则需要使用指针:

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

最新更新