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

标签 c types

我正在创建 * 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/

相关文章:

C:关于struct中二维数组的初学者问题

c - 如何在 C 中创建二维动态字符串数组

c - (char*) 0 是什么意思?

c# 类型来处理相对和绝对 URI 和本地文件路径

c - C 中显示虚数的类型

types - 什么时候仅在运行时才知道类型?

c++ - 以下类型的声明是否完全有效?

c - 在数组声明中使用 strlen

ios - 开启 UIButton title : Expression pattern of type 'String' cannot match values of type 'String?!'

c - 有符号整数的平台独立存储