我想创建一个字段颜色的结构,可以考虑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";
在带有操作系统的现代系统上,最直接的方法是使用malloc/free:
struct A {
int width;
int height;
int length;
char name[50];
char *color;
};
这里的color
只是指向char
类型的内存位置的指针类型。
如何使用?
使用malloc
动态分配内存并将返回的地址保存在color
中,如下所示:
struct A var;
var.color = malloc(sizeof(char) * n);
其中n
是要分配的char
字符的数量。
sizeof(char)
在这里是多余的,因为它保证是1
。
但是,我包含它是因为如果你想,比如说,分配一个int
整数数组,你会使用:
malloc(sizeof(int) * n)
sizeof(int)
并不总是相同的值,它取决于您的体系结构。
此外,在所有情况下,您都需要自己跟踪已分配内存的大小。没有一个标准函数可以通过简单地传递一个指针来告诉你缓冲区有多大。
注意,malloc
可以返回NULL
(一个你永远不应该解引用的指针),以防出现问题,所以你需要在使用malloc
之前检查它的返回值)。
当你用完内存,你必须像这样free
分配的内存:
free(var.color);
// do not use the value of var.color after this
将var.color
的值传递给free
后使用,否则行为未定义(use-after-free)。
如果你不free
你的内存,你可能有内存泄漏的风险。
遵循我对OP的评论,并且假设可接受颜色的数量和名称事先已知下面是一个示例,我将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("%dn",BLUE+GREEN);
}
不用说,其他颜色可以添加到enum
的定义。
同样值得注意的是,enum
将一个整数关联到每一项;算术运算成为可能,如BLUE + GREEN
,它在上面的代码示例中产生3
。
您可以将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 : %sn", a.color);
return 0;
}
输出:
# ./a.out
a.color : Red