我有这个结构
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
,则不知道它是typedef
的struct
还是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.h
和malloc()
的函数原型以及宏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;
}