可变长度的字符

时间:2014-12-30 18:39:34

标签: c char

是否可以定义具有可变长度的char

我有一个char"名称" (struct名为" person")的成员,长度为25,但我希望它是值1和25之间的可变长度,因为我想生成该{的随机字符串{ {1}}具有不同的大小,并不总是具有相同的长度(25)。该方法的一个参数是char

注意:sizeof(n.name)nstruct)。

struct person n" person"以这种方式定义:

struct

任何?

4 个答案:

答案 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'终止符需要一个字符)。

您可以使用以下两种解决方案之一:

  • 使用灵活的阵列成员或
  • 使用指针。

第一个解决方案可让您将namestruct的其余部分保持在一起,但您无法生成这些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;
        };