我正在创建 * create Schedule () 函数来生成 ScheduleData 数据类型的计划,但我收到错误:分配给类型“ScheduleData”时类型不兼容。有人可以帮我解决这个问题吗?
在 Schedule * 函数 createSchedule() 中,在行 schedule->node [i] [j] = schData; 发生错误
struct ScheduleData {
char *initials;
char *classroom;
char *teacher;
};
struct Schedule {
ScheduleData node[8][6];
};
Schedule *createSchedule() {
Schedule *schedule = malloc(sizeof(Schedule));
ScheduleData *schData;
for (int i = 0; i < 8; i++)
for (int j = 0; j < 6; j++) {
schData = malloc(sizeof(ScheduleData));
schData -> initials = NULL;
schData -> classroom = NULL;
schData -> teacher = NULL;
schedule->node[i][j] = schData;
}
return schedule;
}
最佳答案
您的 struct Schedule
包含一组实际的 struct ScheduleData
结构;您尝试将指针分配给这些结构和编译器对象。您不需要嵌套循环中的 malloc()
操作(或对 schedule->node[i][j]
的赋值)——或者您需要 ScheduleData *node[8][6];
.我建议不要在循环中使用 malloc()
。
另外,作为 Martin Rosenau在 comment 中注明,C 编译器不会生成名称 Schedule
(在“普通标识符”命名空间中)给定声明 struct Schedule { … };
— 尽管 C++ 编译器会生成。您需要添加:
typedef struct Schedule Schedule;
typedef struct ScheduleData ScheduleData;
在您使用名称 Schedule
或 ScheduleData
之前,没有之前的 struct
。如果您正在编写 C++ 而不是 C,那么您需要修复问题的标签并且您需要停止使用 malloc()
等。如果您必须在 C++ 中使用 malloc()
等,您将需要显式转换以将 void *
转换为正确的类型——C 中不需要转换。
更少调用 malloc()
Schedule *createSchedule(void)
{
Schedule *schedule = calloc(sizeof(Schedule), 1);
return schedule;
}
calloc()
的使用将结构中的所有字节归零,这通常会将所有指针设置为 NULL 等。(调用代码有责任检查空指针不返回。)或者:
Schedule *createSchedule()
{
Schedule *schedule = malloc(sizeof(Schedule));
if (schedule != NULL)
{
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 6; j++)
{
schedule->data[i][j].initials = NULL;
schedule->data[i][j].classroom = NULL;
schedule->data[i][j].teacher = NULL;
}
}
}
return schedule;
}
您还可以使用 memset()
将 malloc()
提供的数据置零,但是使用 calloc()
将在效率最低。
继续大量使用malloc()
将 struct Schedule
的类型更改为:
struct Schedule
{
ScheduleData *node[8][6];
};
请注意,这会使用更多的内存(每次分配都有开销),并且结构更难释放(您需要调用 49 次 free()
而不是 1 次) .
风格指南
- 在使用结果之前始终检查内存分配函数是否报告成功。
- 不要在点
.
或箭头->
运算符周围放置空格。它们结合得非常紧密;空格是没有根据的、常规的,并且使您的代码更难阅读。 - 请在函数声明和定义中使用显式
Schedule *createSchedule(void)
以指示没有参数。 C 不是 C++;两者之间的规则不同。明确说明void
意味着编译器将警告您createSchedule(32, "pink elephants")
而它没有义务警告您函数的滥用,如果您没有明确指定void
— 如果您省略void
,则您没有创建原型(prototype),只是一个函数声明。
关于c - 如何修复 C 中的 "incompatible type"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57033735/