2

char可変長で aを定義することは可能ですか?

長さ 25のchar「名前」(struct名前付き「人」のメンバー) がありますが、値 1 から 25 の間の可変長にしたいのはchar、異なるサイズのランダムな文字列を生成したいからです。常に同じ長さ (25) です。メソッドのパラメータの 1 つが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]ゼロから 24 までの長さの C 文字列を格納できます ('\0'ターミネータには 1 文字が必要です)。

次の 2 つのソリューションのいずれかを使用できます。

  • 柔軟な配列メンバーを使用する、または
  • ポインターを使用します。

最初の解決策nameでは、 を残りの と一緒に保持できますstructが、これらの の配列を作成することはできませんstruct

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

柔軟な配列メンバーの詳細については、この Q&Aを参照してください。柔軟な配列メンバーを使用するには、C99 と互換性のあるコンパイラが必要です。

2 番目の解決策は、わずかに多くのメモリを必要としますが、サイズは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 に答える