我有这个结构
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
,您不知道它是 struct
的 typedef
,还是 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/