我是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;
创建我需要的对象的最佳方法是什么?
答案 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]
。如果您认为必须使用更多对象扩展数组,则可以更好地指定数组具有的元素数量(最多),或者了解动态分配。