我有这个结构

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


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

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


但是我不太理解malloc()的下一步。有人可以向我解释吗?

最佳答案

您不需要malloc()创建struct的实例。而且我建议您避免仅仅为了减少击键而使用typedef结构。多余的击键将只保存在声明和函数原型中(也许还需要转换),因为您不需要在其他地方使用struct关键字。优点是,当您看到struct FluxCapacitor时,便会确切知道它是什么。如果仅看到FluxCapacitor,则不知道它是typedefstruct还是union或整数类型或其他类型。

请注意,在声明的末尾,发布的代码缺少分号。另外,不清楚为什么要使用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.hmalloc()的函数原型以及宏exit()都包含了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;
}

10-08 13:33
查看更多