C语言 如何在结构中创建字符缓冲区?

qcuzuvrc  于 2022-12-26  发布在  其他
关注(0)|答案(3)|浏览(154)

我想创建一个带有字段颜色的结构,可以考虑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";
zdwk9cvp

zdwk9cvp1#

在具有操作系统的现代系统上执行此操作的最直接方法是使用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 egers数组,你会使用:

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后使用它,否则行为未定义(释放后使用)。

如果你不free你的内存,你可能会冒memory leak的风险。

2lpgd968

2lpgd9682#

接着我对OP的注解,假设可接受颜色的数量和名称是事先已知的,下面是一个示例,我使用enumtypedef定义了一个类型,该类型列出了程序允许的所有可能的颜色,以便用户可以在代码的其余部分中通过名称引用每种颜色。

#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

r8xiu3jd

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

相关问题