首先,您需要决定您要做什么。
如果您想要一个带有指向独立数组的指针的结构体,请将其声明为
struct my_struct {
int n;
char *s;
};
在这种情况下,你可以以任何方式创建实际的结构体对象(例如自动变量)。
struct my_struct ms;
然后独立分配数组的内存
ms.s = malloc(50 * sizeof *ms.s)
实际上,通常没有必要动态分配数组内存。
struct my_struct ms;
char s[50];
ms.s = s;
这完全取决于你需要这些对象有何种生存周期。如果你的结构体是自动的,那么在大多数情况下,数组也将是自动的。如果结构体对象拥有数组内存,那么没有必要采用其他方式。如果结构体本身是动态的,则数组通常也应该是动态的。
请注意,在这种情况下,你有两个独立的内存块:结构体和数组。
另一种完全不同的方法是使用“结构体尺寸技巧”。在这种情况下,数组成为结构体的一个组成部分。两者都存在于单个内存块中。在C99中,结构体的声明方式如下:
struct my_struct {
int n;
char s[];
};
而要创建一个对象,您必须动态地分配整个对象
struct my_struct *ms = malloc(sizeof *ms + 50 * sizeof *ms->s);
在这种情况下,内存块的大小被计算以容纳结构体成员和运行时大小的尾随数组。
请注意,在此情况下,您无法选择创建静态或自动对象等结构体对象。在C中,只能动态分配具有灵活数组成员的结构体。
你对指针运算比数组更快的假设是完全错误的。按定义,数组通过指针运算工作,因此它们基本上是相同的。此外,一个真正的数组(而不是衰减到指针)通常比指针对象稍快一些。必须从内存中读取指针值,而数组在内存中的位置是从数组对象本身“已知”(或“计算”的)。
char s[]
在函数参数列表中的作用和char *s
是一样的,只是写法不同。 - Alok Singhal