![](/img/trans.png)
[英]Passing a pointer to an array of structs to a function for 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.