如何在C中创建对象数组?

时间:2016-09-24 15:23:52

标签: c arrays struct typedef

我是C的新手,来自像javascript这样的语言,语言中的类型,关键字等数量令人痛苦地混淆。

在javascript中我可以像这样创建一个对象数组。

arrayOfObjectsInsideJavascript = [
    { s:"ejf09j290fj390j2f09", f=0 },
    { s:"dj320992209920209dj", f=0 }
]

从我所读过的内容来看,我似乎需要使用typedef和/ struct

我试过了:

typedef struct[] = {
    { s:"ejf09j290fj390j2f09", f=0 },
    { s:"dj320992209920209dj", f=0 }
}

struct[] = {
    { s:"ejf09j290fj390j2f09", f=0 },
    { s:"dj320992209920209dj", f=0 }
}

typedef struct {
    char[] s = "ejf09j290fj390j2f09";
    int f = 0; 
} objectLikeClassThingy;

创建我需要的对象的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

像这样?

struct  {
    const char *s;
    double f;
} obj[] = {
    { .s = "ejf09j290fj390j2f09", .f = 0 },
    { .s = "dj320992209920209dj", .f = 0 }
};

答案 1 :(得分:0)

JavaScript具有动态"属性",C具有静态"标记"。结构类型被定义为一系列标签,每个标签都有一个类型。

对于示例数组中的类型

arrayOfObjectsInsideJavascript = [
    { s:"ejf09j290fj390j2f09", f=0 },
    { s:"dj320992209920209dj", f=0 }
]

您的上一个解决方案几乎正确启动:

struct element {
    char s[256];
    int f;
};

s的类型有两种选择:

  • 如果要将字符串存储在对象中,可以使用某种数组类型,例如char s[256]256是数组的长度,因此当您使用以零结尾的字符串时,允许的最大字符串长度为255(对于'\0'字符为256,减去1)。
  • 如果要将字符串存储在对象外部,可以使用某种指针类型。由于您要使用字符串文字,因此应将标记声明为const char *s。更改字符串文字会导致未定义的行为,因此最好不要这样做。

对于这个答案,我将使用示例中的第一个选项。

如果要定义一个结构,现在可以编写类似

的内容
struct element {
    char s[256];
    int f;
} one_object = {
    .s = "ejf09j290fj390j2f09",
    .f = 0,
};

struct element {
    char s[256];
    int f;
};

/* ... later, in a scope where `struct element` is visible ... */

struct element one_object = {
    .s = "ejf09j290fj390j2f09",
    .f = 0,
};

或使用typedef

typedef struct {
    char s[256];
    int f;
} your_element_type;

/* ... later, in a scope where `your_element_type` is visible ... */

your_element_type one_object = {
    .s = "ejf09j290fj390j2f09",
    .f = 0,
};

请注意,这并不一定适用于不支持C99标准的旧编译器。在过去,您必须按顺序初始化字段:

your_element_type one_object = { "ejf09j290fj390j2f09", 0 };

另请注意,如果您再也不会引用类型名称struct element,则不必 为其命名:

struct {
    char s[256];
    int f;
} one_object = {
    .s = "ejf09j290fj390j2f09",
    .f = 0,
};

阵列的初始化类似(你实际上已经初始化了一个数组,即s,带有一个字符串):

struct element {
    char s[256];
    int f;
} so_many_objects[] = {
    { .s = "ejf09j290fj390j2f09", .f = 0 },
    { .s = "dj320992209920209dj", .f = 0 },
};

struct element {
    char s[256];
    int f;
};

/* ... later, in a scope where `struct element` is visible ... */

struct element so_many_objects[] = {
    { .s = "ejf09j290fj390j2f09", .f = 0 },
    { .s = "dj320992209920209dj", .f = 0 },
};

或者,再次使用typedef

typedef struct {
    char s[256];
    int f;
} your_element_type;

/* ... later, in a scope where `your_element_type` is visible ... */

your_element_type so_many_objects[] = {
    { .s = "ejf09j290fj390j2f09", .f = 0 },
    { .s = "dj320992209920209dj", .f = 0 },
};

顺便提一下,请注意我们使用so_many_objects的不完整类型;这是唯一可能的,因为编译器可以看到数组应该有多大。在这些示例中,编译器会将您的代码视为您已编写struct element so_many_objects[2]。如果您认为必须使用更多对象扩展数组,则可以更好地指定数组具有的元素数量(最多),或者了解动态分配。