是否可以定义具有可变长度的char
?
我有一个char
"名称" (struct
名为" person")的成员,长度为25,但我希望它是值1和25之间的可变长度,因为我想生成该{的随机字符串{ {1}}具有不同的大小,并不总是具有相同的长度(25)。该方法的一个参数是char
。
注意:sizeof(n.name)
是n
(struct
)。
struct person n
" person"以这种方式定义:
struct
任何?
答案 0 :(得分:4)
struct person{
int c;
char name[]; /* Variable length array */
};
我认为这应该符合你的目的。
否则,您可以使用
进行动态内存分配char *name;
name
是指针,应该分配内存,可以使用malloc()
答案 1 :(得分:3)
您可以使用灵活的阵列。它必须是结构的最后一个数据成员。
struct person{
int c;
char name[];
};
必须动态分配具有灵活数组的结构的内存。
来自C标准(6.7.2.1结构和联合说明符)
忽略灵活数组成员。特别是,大小 结构就好像除了灵活的阵列成员一样 它可能有更多的尾随填充,而不是遗漏意味着。 Howev 呃,当。 (或 - >)运算符有一个左操作数(指针 to)具有灵活数组成员和右操作数的结构 命名该成员,其行为就好像该成员被替换为 不能制作的最长数组(具有相同的元素类型) 结构大于被访问的对象;的偏移量 数组应保持灵活数组成员的数组,即使这样 将与替换阵列的不同。如果这个数组会 没有元素,它表现得好像它有一个元素但行为 如果有任何尝试访问该元素或是否,则未定义 生成一个经过它的指针。
还有一个使用
的例子20 EXAMPLE 2 After the declaration:
struct s { int n; double d[]; };
the structure struct s has a flexible array member d. A typical way to use this is:
int m = /* some value */;
struct s *p = malloc(sizeof (struct s) + sizeof (double [m]));
and assuming that the call to malloc succeeds, the object pointed to by p behaves, for most purposes, as if
p had been declared as:
struct { int n; double d[m]; } *p;
(there are circumstances in which this equivalence is broken; in particular, the offsets of member d might
not be the same).
或者您可以声明指向char的指针并仅动态分配数组本身
struct person{
int c;
char *name;
};
答案 2 :(得分:2)
char[25]
允许您存储长度介于0到24之间的C字符串('\0'
终止符需要一个字符)。
您可以使用以下两种解决方案之一:
第一个解决方案可让您将name
与struct
的其余部分保持在一起,但您无法生成这些struct
的数组:
struct person{
int c;
char name[];
};
有关灵活阵列成员的更多信息,请参阅this Q&A。您需要与C99兼容的编译器才能使用灵活的阵列成员。
第二种解决方案需要更多内存,但struct
的大小不会改变,因此可以在数组中使用它:
struct person{
int c;
char *name;
};
答案 3 :(得分:-1)
更好的方法是使用字符串库并声明字符串类型的变量“name”。
#include<string>
struct person{
int c;
string name;
};