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

如何在C中创建对象数组?,c,arrays,struct,typedef,C,Arrays,Struct,Typedef,我是C语言的新手,来自javascript这样的语言。语言中的类型、关键字等数量令人痛苦地困惑 在javascript中,我可以创建这样的对象数组 arrayOfObjectsInsideJavascript = [ { s:"ejf09j290fj390j2f09", f=0 }, { s:"dj320992209920209dj", f=0 } ] 从我读到的内容来看,我似乎需要使用typedef和或structs 我试过: typedef struct[] = {

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

在javascript中,我可以创建这样的对象数组

arrayOfObjectsInsideJavascript = [
    { s:"ejf09j290fj390j2f09", f=0 },
    { s:"dj320992209920209dj", f=0 }
]
从我读到的内容来看,我似乎需要使用
typedef
和或
struct
s

我试过:

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;

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

像这样

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

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

JavaScript有动态的“属性”,C有静态的“标记”。结构类型定义为一系列标记,每个标记都有一个类型

用于示例数组中的类型

arrayOfObjectsInsideJavascript = [
    { s:"ejf09j290fj390j2f09", f=0 },
    { s:"dj320992209920209dj", f=0 }
]
您的上一个解决方案开始时几乎正确:

struct element {
    char s[256];
    int f;
};
对于
s
的类型,有两个选项:

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


如果您想定义一个结构,现在可以编写如下内容

struct element {
    char s[256];
    int f;
} 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元素
,则不必将其命名为:


数组的初始化方式类似(实际上您已经用字符串初始化了数组,即
s
):

或者,再次使用
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 },
};

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

如果JavaScript具有动态“属性”,则C具有静态“标记”。结构类型定义为一系列标记,每个标记都有一个类型

用于示例数组中的类型

arrayOfObjectsInsideJavascript = [
    { s:"ejf09j290fj390j2f09", f=0 },
    { s:"dj320992209920209dj", f=0 }
]
您的上一个解决方案开始时几乎正确:

struct element {
    char s[256];
    int f;
};
对于
s
的类型,有两个选项:

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


如果您想定义一个结构,现在可以编写如下内容

struct element {
    char s[256];
    int f;
} 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元素
,则不必将其命名为:


数组的初始化方式类似(实际上您已经用字符串初始化了数组,即
s
):

或者,再次使用
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 },
};

顺便说一句,请注意,我们对
这么多对象使用的是不完整的类型
;这只可能是因为编译器可以看到数组应该有多大。在这些示例中,编译器会将您的代码视为编写了如此多的对象[2]。如果您认为必须使用更多对象扩展数组,那么最好指定数组的元素数(最多),或者学习动态分配。

在C中没有类和对象的概念,因为它不是面向对象的,所以我想问题应该是
如何在C中创建结构数组?
我不明白这个评论的意思,如果我甚至不知道如何创建一个结构,为什么你要告诉我应该把这个问题命名为“如何在C中创建一个结构数组?”那么答案是你不能,因为没有对象的概念(类的实例)在C中,
创建我需要的对象的最佳方式是什么?
我明确要求创建我想要的对象的最佳方式,而不是在C中创建javascript数组和javascript对象的最佳方式。说我不能是学究式的。“创建我需要的对象的最佳方式是什么?”-学习语言并编写C代码。没有C语言的知识,你注定会在C语言中遇到永久性的问题。这不是一种尝试和错误的语言!在C语言中没有类和对象的概念,因为它不是面向对象的,所以我想问题应该是如何在C语言中创建一个结构数组?我不明白这个评论的意思,如果我甚至不知道如何创建一个结构,你为什么告诉我我应该命名这个问题“我如何在C中创建一个结构数组?”那么对你们的问题的答案是你们不能,因为C中并没有对象(类的实例)的概念<