创建结构体的实例

标签 c

我有这个结构

struct FluxCapacitor{
    unsigned char* c_string;
    unsigned int value;
};

现在我需要创建该结构的一个实例。我用谷歌搜索了这个问题,发现我必须使用这样的东西

typedef struct FluxCapacitor{
    unsigned char* c_string
    unsigned int value;
};  

但我不太明白 malloc() 的下一步。有人可以给我解释一下吗?

最佳答案

您不需要 malloc() 来创建 struct 的实例。我建议您避免仅仅为了减少击键而typedef结构。额外的击键只会保存在声明和函数原型(prototype)中(也许如果您需要转换某些内容),因为您在其他地方不需要 struct 关键字;优点是当你看到 struct FluxCapacitor 时,你就知道它是什么。如果您只看到 FluxCapacitor,您不知道它是 structtypedef,还是 union code>,或者整数类型或者什么。

请注意,发布的代码在声明末尾缺少分号。另外,还不清楚为什么你有 unsigned char* c_string;。这可能不允许分配给字符串文字。我在下面的代码中更改了这一点。您可以像这样创建一个struct:

struct FluxCapacitor
{
    char *c_string;
    unsigned int value;
};

...

struct FluxCapacitor fcap_1;

然后您可以为 fcap_1 的字段赋值:

fcap_1.c_string = "McFly";
fcap_1.value = 42;

请注意,您还可以在声明时使用指定的初始值设定项:

struct FluxCapacitor fcap_2 = { .c_string = "Biff",
                                .value = 1985
};

如果您需要一组 FluxCapacitor 结构,只需声明一个即可:

struct FluxCapacitor fcaps[2];

您可以在循环中分配给每个数组成员的字段:

struct FluxCapacitor fcaps[2];

char *somestrings[] = { "McFly", "Biff" };
unsigned somevalues[] = { 42, 1985 };

for (size_t i = 0; i < 2; i++) {
    fcaps[i].c_string = somestrings[i];
    fcaps[i].value = somevalues[i];
}

或者,您也可以在此处使用指定的初始值设定项:

struct FluxCapacitor fcaps[2] = { { .c_string = "McFly", .value = 42 },
                                  { .c_string = "Biff", .value = 1985}
};

使用malloc()

由于 OP 似乎决定使用 malloc(),因此最好首先记住使用 malloc() 分配的内存稍后必须使用 free 释放()。另请注意,malloc() 可能无法分配内存,从而返回空指针。因此,在尝试取消引用此指针之前,必须检查对 malloc() 的调用结果。应避免额外的复杂性,以支持上述方法,除非 OP 有充分的理由进行手动分配。

在下面的代码中,函数 create_flux_cap() 接受一个字符串和一个 unsigned int 作为参数,并返回一个指向新分配的 FluxCapacitor 结构,参数分配给适当的字段。请注意,由于 FluxCapacitor 结构是通过指针访问的,因此使用箭头运算符而不是点运算符。

在函数内部,在尝试分配之前会检查调用 malloc() 的返回值。如果分配失败,则不进行任何分配,并将空指针返回给调用函数。请注意,在对 malloc() 的调用中,结果不会进行强制转换,因为在 C 中不需要这样做,并且它不必要地使代码变得困惑。另请注意,使用 sizeof 运算符使用标识符而不是显式类型。这更不容易出错,如果将来类型发生变化,也更容易维护,并且代码更简洁。也就是说,而不是这个:

new_fcap = (struct FluxCapacitor *)malloc(sizeof (struct FluxCapacitor));

使用这个:

new_fcap = malloc(sizeof *new_fcap);

main()中,检查调用create_flux_cap()的返回值。如果分配失败,程序将退出并显示错误消息。

stdlib.h 头文件已包含在 malloc()exit() 的函数原型(prototype)中,也包含在宏EXIT_FAILURE

#include <stdio.h>
#include <stdlib.h>

struct FluxCapacitor
{
    char* c_string;
    unsigned value;
};

struct FluxCapacitor * create_flux_cap(char *, unsigned);

int main(void)
{
    struct FluxCapacitor *fcap_1 = create_flux_cap("McFly", 42);
    struct FluxCapacitor *fcap_2 = create_flux_cap("Biff", 1985);

    /* Check for allocation errors */
    if (fcap_1 == NULL || fcap_2 == NULL) {
        fprintf(stderr, "Unable to create FluxCapacitor\n");
        exit(EXIT_FAILURE);
    }

    /* Display contents of structures */
    printf("%s, %u\n", fcap_1->c_string, fcap_1->value);
    printf("%s, %u\n", fcap_2->c_string, fcap_2->value);

    /* Free allocated memory */
    free(fcap_1);
    free(fcap_2);

    return 0;
}

struct FluxCapacitor * create_flux_cap(char *str, unsigned val)
{
    struct FluxCapacitor *new_fcap;

    new_fcap = malloc(sizeof *new_fcap);

    if (new_fcap != NULL) {
        new_fcap->c_string = str;
        new_fcap->value = val;
    }

    return new_fcap;
}

关于创建结构体的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43191296/

相关文章:

c++ - 改变其他静态库使用的静态库

c - 跟踪数据包通过内核 (linux)

无法完成国际象棋 table 上马的所有可能走法

c - 数组向左旋转(递归)

c - pthreads: 在 Redhat 6.8 下不能生成超过 70 个

c++ - WinAPI 函数 Hook 以捕获网络

c - 在 C 中平均成绩

c - 如何将服务器的日期时间转换为unix时间戳?

c - 写入文件并使用带循环的 if 语句

c - 为什么我的数组中有重复项?