gpt4 book ai didi

c - 如何修复 C 中的 "incompatible type"错误?

转载 作者:太空宇宙 更新时间:2023-11-04 05:15:57 25 4
gpt4 key购买 nike

我正在创建 * 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 Rosenaucomment 中注明,C 编译器不会生成名称 Schedule(在“普通标识符”命名空间中)给定声明 struct Schedule { … }; — 尽管 C++ 编译器会生成。您需要添加:

typedef struct Schedule Schedule;
typedef struct ScheduleData ScheduleData;

在您使用名称 ScheduleScheduleData 之前,没有之前的 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 次) .

风格指南

  1. 在使用结果之前始终检查内存分配函数是否报告成功。
  2. 不要在点 . 或箭头 -> 运算符周围放置空格。它们结合得非常紧密;空格是没有根据的、常规的,并且使您的代码更难阅读。
  3. 请在函数声明和定义中使用显式 Schedule *createSchedule(void) 以指示没有参数。 C 不是 C++;两者之间的规则不同。明确说明 void 意味着编译器将警告您 createSchedule(32, "pink elephants") 而它没有义务警告您函数的滥用,如果您没有明确指定 void — 如果您省略 void,则您没有创建原型(prototype),只是一个函数声明。

关于c - 如何修复 C 中的 "incompatible type"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57033735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com