c - 正确初始化 C 中的递归结构类型

标签 c recursion struct

我是 C 编程新手,我有以下结构:

typedef struct _date {
    char d[10], t[5], s[3];
    struct _date *next;
} *date;

如何正确创建此实例?

我的解决方案:

date neuerTermin(char *d, char *t, char *s, date cal) {
    struct _date d = {*d, *t, *s, NULL};
    date d_ptr = malloc(sizeof *d);
    cal->next = d_ptr;

    return d;
}

但我收到错误:警告:初始化从指针生成整数而无需转换

最佳答案

您可以按如下方式进行:

#include <stdio.h>

typedef struct _date {
    char d[11], t[6], s[4]; // +1 to size for null-terminator ('\0')
    struct _date *next;
} *date;


int main() {
    struct _date a = { "15.07.2017", "16:00", "Foo", NULL };
    date a_ptr = &a;

    printf("Description: %s\nDate: %s\nTime: %s\n", a_ptr->s, a_ptr->d, a_ptr->t);
    return 0;
}

上例中用大括号括起来、以逗号分隔的列表是 struct initializer .

<小时/>

为了回复您问题的编辑,如果您希望动态分配 struct _date 实例并在函数中初始化它们,请使用 malloc如下:

date neuerTermin(const char* d, const char* t, const char* s) {
    date cal = (date)malloc(sizeof(struct _date));

    strncpy(cal->d, d, 10);
    strncpy(cal->t, t, 5);
    strncpy(cal->s, s, 3);
    cal->next = NULL;

    return cal;
}

在这种情况下,您必须逐个成员填充 cal 指向的内存块。使用示例:

date root = neuerTermin("15.07.2017", "16:00", "Foo");
root->next = neuerTermin("27.07.2017", "10:00", "Bar");
root->next->next = neuerTermin("01.08.2017", "12:30", "Baz");

重要提示:如果您使用 malloc 来分配内存,则还必须使用 free 来取消分配它。当你不再需要它时。

关于c - 正确初始化 C 中的递归结构类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45133039/

相关文章:

c - 关于数据类型的段错误?

c - sem_unlink 权限被拒绝

c - 在子进程和父进程之间发送数据时如何使用两个管道?

java - 为什么这种递归方法有效?

c++ - 成员变量与函数参数

c# - 为什么泛型结构不能具有在 C# 中指定泛型类型的静态成员?

c - 为什么局部变量不匹配全零条件?

javascript bluebird Promise -> 从异步列表中获取第一个文件

java - 如何使用 Java 递归打印(但不返回)字符串?

C# 相当于 Python 的 struct.pack?