我想创建一个带有字段颜色的结构,可以考虑n个字符。那么,如果没有特定的大小,我如何创建它:
struct A { int width; int height; int length; char name[50]; **char color[];** };
struct A a = { 10, 20, 30, "Hello", "Red" };
我试着测试它没有结构和所有的工作,为什么?
char p[] = "Hallo";
zdwk9cvp1#
在具有操作系统的现代系统上执行此操作的最直接方法是使用malloc/free:
struct A { int width; int height; int length; char name[50]; char *color; };
这里color只是指向char类型的内存位置的指针类型。如何使用它?使用malloc动态分配内存,并将返回的地址保存在color中,如下所示:
color
char
malloc
struct A var; var.color = malloc(sizeof(char) * n);
其中n是要分配的char角色数。这里的sizeof(char)是多余的,因为它肯定是1。但是,我之所以包含它,是因为如果你想,比如说,分配一个int egers数组,你会使用:
n
sizeof(char)
1
int
malloc(sizeof(int) * n)
sizeof(int)并不总是相同的值,它取决于您的体系结构。此外,在任何情况下,你都需要自己记录分配给你的内存的大小,没有一个标准函数可以通过简单地传递一个指针来告诉你缓冲区有多大。请注意,malloc可以返回NULL(一个永远不应该解引用的指针),以防出现错误,因此在使用它之前需要检查malloc的返回值)。当你用完内存后,你必须像这样free分配内存:
sizeof(int)
NULL
free
free(var.color); // do not use the value of var.color after this
var.color
如果你不free你的内存,你可能会冒memory leak的风险。
2lpgd9682#
接着我对OP的注解,假设可接受颜色的数量和名称是事先已知的,下面是一个示例,我使用enum和typedef定义了一个类型,该类型列出了程序允许的所有可能的颜色,以便用户可以在代码的其余部分中通过名称引用每种颜色。
enum
typedef
#include <stdio.h> typedef enum{ RED = 0, GREEN = 1, BLUE = 2 } Colors; struct A { int width; int height; int length; char name[50]; Colors color; }; int main(void){ struct A a = { 10, 20, 30, "Hello", RED }; printf("%d\n",BLUE+GREEN); }
不用说,可以将其他颜色添加到enum定义中。还值得注意的是,enum将一个整数与每个项关联;如在BLUE + GREEN中,算术变得可能,这在上面的代码样本中产生3。
BLUE + GREEN
3
r8xiu3jd3#
您可以将color字段作为指向char的指针,并创建一个enum,其元素指示颜色,并将其用作字符串数组中的指定初始化器,该字符串数组将具有颜色名称。enum元素可用作颜色名称数组中的索引,以获得适当的颜色名称,并可将其分配给结构color字段,如下所示:
#include <stdio.h> enum colors { WHITE = 0, BLACK, RED, GREEN, BLUE, MAX_COLOR }; char * color_names[MAX_COLOR + 1] = { [WHITE] = "White", [BLACK] = "Black", [RED] = "Red", [GREEN] = "Green", [BLUE] = "Blue", [MAX_COLOR] = NULL }; struct A { int width; int height; int length; char name[50]; char * color; }; int main (void) { struct A a = { 10, 20, 30, "Hello", color_names[RED] }; printf ("a.color : %s\n", a.color); return 0; }
输出:
# ./a.out a.color : Red
3条答案
按热度按时间zdwk9cvp1#
在具有操作系统的现代系统上执行此操作的最直接方法是使用malloc/free:
这里
color
只是指向char
类型的内存位置的指针类型。如何使用它?
使用
malloc
动态分配内存,并将返回的地址保存在color
中,如下所示:其中
n
是要分配的char
角色数。这里的
sizeof(char)
是多余的,因为它肯定是1
。但是,我之所以包含它,是因为如果你想,比如说,分配一个
int
egers数组,你会使用:sizeof(int)
并不总是相同的值,它取决于您的体系结构。此外,在任何情况下,你都需要自己记录分配给你的内存的大小,没有一个标准函数可以通过简单地传递一个指针来告诉你缓冲区有多大。
请注意,
malloc
可以返回NULL
(一个永远不应该解引用的指针),以防出现错误,因此在使用它之前需要检查malloc
的返回值)。当你用完内存后,你必须像这样
free
分配内存:var.color
的值传递给free
后使用它,否则行为未定义(释放后使用)。如果你不
free
你的内存,你可能会冒memory leak的风险。2lpgd9682#
接着我对OP的注解,假设可接受颜色的数量和名称是事先已知的,下面是一个示例,我使用
enum
和typedef
定义了一个类型,该类型列出了程序允许的所有可能的颜色,以便用户可以在代码的其余部分中通过名称引用每种颜色。不用说,可以将其他颜色添加到
enum
定义中。还值得注意的是,
enum
将一个整数与每个项关联;如在BLUE + GREEN
中,算术变得可能,这在上面的代码样本中产生3
。r8xiu3jd3#
您可以将
color
字段作为指向char
的指针,并创建一个enum
,其元素指示颜色,并将其用作字符串数组中的指定初始化器,该字符串数组将具有颜色名称。enum
元素可用作颜色名称数组中的索引,以获得适当的颜色名称,并可将其分配给结构color
字段,如下所示:输出: