2

是否可以定义char可变长度的 a ?

我有一个长度为 25 的char“名称”(struct命名“人”的成员),但我希望它是值 1 和 25 之间的可变长度,因为我想生成char不同大小的随机字符串,而不是始终具有相同的长度 (25)。该方法的参数之一是sizeof(n.name).

注:nstruct( struct person n)。

struct人”是这样定义的:

    struct person{
       int c; 
       char name[25];
    };

任何人?

4

4 回答 4

5
struct person{
   int c; 
   char name[]; /* Variable length array */
};

我认为这应该符合您的目的。

否则,您可以使用动态内存分配

char *name;

name是一个指针,应该分配内存,可以使用malloc()

于 2014-12-30T18:41:21.207 回答
4

您可以使用灵活的数组。它必须是结构的最后一个数据成员。

struct person{
   int c; 
   char name[];
};

具有灵活数组的结构的内存必须动态分配。

来自 C 标准(6.7.2.1 结构和联合说明符)

灵活的数组成员被忽略。特别是,结构的大小就像省略了柔性数组成员一样,只是它可能具有比省略所暗示的更多的尾随填充。然而,当一个 . (或->)运算符的左操作数是(指向)具有灵活数组成员的结构,右操作数命名该成员,它的行为就像该成员被替换为最长的数组(具有相同的元素类型) 不会使结构大于被访问的对象;数组的偏移量应保持灵活数组成员的偏移量,即使这与替换数组的偏移量不同。如果这个数组没有元素,

还有一个使用它的例子

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;
    };
于 2014-12-30T18:43:10.480 回答
2

char[25]'\0'让您可以存储长度在 0 到 24 之间的 C 字符串(包括 0 到 24)(终止符需要一个字符)。

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

  • 使用灵活的数组成员,或
  • 使用指针。

第一个解决方案让您将name与 的其余部分保持在一起struct,但您将无法制作这些structs 的数组:

struct person{
     int c; 
     char name[];
};

有关灵活数组成员的更多信息,请参阅此问答。您需要与 C99 兼容的编译器才能使用灵活的数组成员。

第二种解决方案需要更多的内存,但您的大小struct不会改变,因此可以在数组中使用它:

struct person{
     int c; 
     char *name;
};
于 2014-12-30T18:44:02.900 回答
-1

更好的方法是使用字符串库并声明字符串类型的变量“名称”。

#include<string>   

 struct person{
           int c; 
           string name;
        };
于 2014-12-30T18:44:01.600 回答