タグ付けされた質問 「struct」

構文がCに似ている、またはCから派生したさまざまなプログラミング言語のキーワード(C ++、C#、Swift、Go、Rustなど)。構文とセマンティクスは言語に依存する可能性があるため、特定のプログラミング言語タグを使用して、 `struct`の使用を含む質問にタグを付けます。キーワードは、他のデータ型で構成されるデータ型を定義または宣言します。構造体の各メンバーには独自のメモリ領域があります(メンバーが単一のメモリ領域を共有する「共用体」とは対照的)。

3
Cでの構造体メモリレイアウト
私はC#のバックグラウンドを持っています。私はCのような低水準言語の初心者です。 C#では、 structのメモリはデフォルトでコンパイラによってレイアウトされます。コンパイラは、データフィールドを並べ替えたり、フィールド間に追加のビットを暗黙的に埋めたりすることができます。そのため、正確なレイアウトのためにこの動作をオーバーライドするために、いくつかの特別な属性を指定する必要がありました。 AFAIK、Cはstruct、デフォルトでは、のメモリレイアウトを並べ替えたり整列したりしません。ただし、見つけるのが非常に難しい小さな例外があると聞きました。 Cのメモリレイアウト動作とは何ですか?何を再注文/調整する必要がありますか?

14
C#で構造体をバイト配列に変換する方法は?
C#で構造体をバイト配列に変換するにはどうすればよいですか? 私はこのような構造を定義しました: public struct CIFSPacket { public uint protocolIdentifier; //The value must be "0xFF+'SMB'". public byte command; public byte errorClass; public byte reserved; public ushort error; public byte flags; //Here there are 14 bytes of data which is used differently among different dialects. //I do want the flags2. However, so …
83 c#  struct 


12
CまたはC ++で構造体を返すのは安全ですか?
私が理解しているのは、これを行うべきではないということですが、このようなことを行う例を見たことがあると思います(コードは必ずしも構文的に正しいとは限りませんが、アイデアはそこにあります) typedef struct{ int a,b; }mystruct; そして、ここに関数があります mystruct func(int c, int d){ mystruct retval; retval.a = c; retval.b = d; return retval; } このようなことをしたい場合は、mallocされた構造体へのポインターを常に返す必要があることを理解しましたが、このようなことを行う例を見たことがあると確信しています。これは正しいです?個人的には、常にmallocされた構造体へのポインターを返すか、関数を参照してパスを実行し、そこで値を変更します。(私の理解では、関数のスコープが終了すると、構造を割り当てるために使用されたスタックはすべて上書きされる可能性があります)。 質問に2番目の部分を追加しましょう:これはコンパイラによって異なりますか?もしそうなら、デスクトップ用のコンパイラの最新バージョン(gcc、g ++、Visual Studio)の動作はどうなりますか? 問題についての考え?

16
Cの構造体メンバーのデフォルト値
一部の構造体メンバーにデフォルト値を設定することは可能ですか?次のことを試しましたが、構文エラーが発生します。 typedef struct { int flag = 3; } MyStruct; エラー: $ gcc -o testIt test.c test.c:7: error: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘=’ token test.c: In function ‘main’: test.c:17: error: ‘struct <anonymous>’ has no member named ‘flag’
82 c  struct 

6
C ++構造体を初期化する適切な方法
私たちのコードには、POD(Plain Old Datastructure)構造体が含まれています(これは、最初に初期化する必要がある他の構造体とPOD変数を含む基本的なc ++構造体です)。 私が読んだものに基づいて、それは次のようです: myStruct = (MyStruct*)calloc(1, sizeof(MyStruct)); 次のように、すべての値をゼロに初期化する必要があります。 myStruct = new MyStruct(); ただし、構造体が2番目の方法で初期化されると、Valgrindは後で、これらの変数が使用されたときに「条件付きジャンプまたは移動は初期化されていない値に依存する」と文句を言います。私の理解はここに欠陥がありますか、それともValgrindは誤検知を投げていますか?

4
構造体の何が特別なのですか?
Cでは、関数から配列を返すことはできませんが、配列へのポインターを返すことができます。しかしstructs、配列が含まれている場合でも、関数によって返されるようにする特別な点は何ですか。 structラッピングによって次のプログラムが有効になるのはなぜですか? #include <stdio.h> struct data { char buf[256]; }; struct data Foo(const char *buf); int main(void) { struct data obj; obj = Foo("This is a sentence."); printf("%s\n", obj.buf); return 0; } struct data Foo(const char *buf) { struct data X; strcpy(X.buf, buf); return X; }

4
構造体の配列の最後に空の中括弧 '{}'が必要なのは何ですか?
Linuxカーネルでc コードをいくつかヒットしました。 static struct ctl_table ip_ct_sysctl_table[] = { { .procname = "ip_conntrack_max", .maxlen = sizeof(int), .mode = 0644, .proc_handler = proc_dointvec, }, // ... { .procname = "ip_conntrack_log_invalid", .maxlen = sizeof(unsigned int), .mode = 0644, .proc_handler = proc_dointvec_minmax, .extra1 = &log_invalid_proto_min, .extra2 = &log_invalid_proto_max, }, { } }; ここで、構造体の配列はで終わり{ }ます。どのような目的で追加されましたか? …

1
Cでのオブジェクトのオーバーラップのセマンティクスは何ですか?
次の構造体について考えてみましょう。 struct s { int a, b; }; 典型的には1、この構造体は、サイズ8と位置合わせ4を有するであろう。 2つのstruct sオブジェクトを作成し(より正確には、2つのオブジェクトを割り当てられたストレージに書き込みます)、2番目のオブジェクトが最初のオブジェクトと重なる場合はどうなりますか? char *storage = malloc(3 * sizeof(struct s)); struct s *o1 = (struct s *)storage; // offset 0 struct s *o2 = (struct s *)(storage + alignof(struct s)); // offset 4 // now, o2 points half way into o1 *o1 …

2
[[no_unique_address]]と同じタイプの2つのメンバー値
で遊ん[[no_unique_address]]でいc++20ます。 cppreferenceの例では、空のタイプEmptyとタイプがありますZ struct Empty {}; // empty class struct Z { char c; [[no_unique_address]] Empty e1, e2; }; どうやら、の大きさはZ、少なくともなければならない2ので、タイプのe1とe2同じです。 しかし、私は本当にZサイズが欲しいです1。これEmptyによりe1、さまざまなタイプのとを適用する追加のテンプレートパラメーターを使用して、いくつかのラッパークラスでラップすることについて考えましたe2。 template <typename T, int i> struct Wrapper : public T{}; struct Z1 { char c; [[no_unique_address]] Wrapper<Empty,1> e1; [[no_unique_address]] Wrapper<Empty,2> e2; }; 残念ながら、sizeof(Z1)==2。サイズをZ11 にするためのコツはありますか? 私はこれをテストしていますgcc version 9.2.1し、clang version 9.0.0 私のアプリケーションでは、フォームの空のタイプがたくさんあります …

6
C ++でジェネリック構造体を比較する方法は?
構造体を一般的な方法で比較したいのですが、次のようなことをしました(実際のソースを共有できないため、必要に応じて詳細を尋ねます)。 template<typename Data> bool structCmp(Data data1, Data data2) { void* dataStart1 = (std::uint8_t*)&data1; void* dataStart2 = (std::uint8_t*)&data2; return memcmp(dataStart1, dataStart2, sizeof(Data)) == 0; } 2つの構造体インスタンスに同じメンバーが含まれている場合(ただし、Eclipseデバッガーで確認しました)でもfalseを返す場合があることを除いて、これはほとんど意図どおりに機能します。いくつか検索した後memcmp、使用された構造体が埋め込まれているために失敗する可能性があることを発見しました。 パディングに無関心なメモリを比較するより適切な方法はありますか?使用する構造体を変更することはできません(使用しているAPIの一部です)。使用する多くの異なる構造体にはいくつかの異なるメンバーがあるため、一般的な方法で個別に比較することはできません(私の知る限り)。 編集:残念ながら、C ++ 11を使用しています。これは以前に言及したはずです...

1
3レベルの配列を初期化するのに3レベルのブレースが必要ないのはなぜですか?
私はこの例に出くわしました struct sct { int t[2]; }; struct str { sct t[2]; }; int main() { str t[2] = { {0, 2, 4, 6}, {1, 3, 5, 7} }; //Who does this work? cout << t[1].t[0].t[1] << t[0].t[1].t[0]; return 0; } これはコンパイルして正常に動作します。それは出力を与えます34 初期化の構文は次のようになるはずです。 str t[2] = { { {0, 2},{4, …

4
構造体および構造体メンバーの配列要素
Cでの構造体宣言について質問したい。たとえば、 struct Person { char name[50]; int citNo; float salary; } prsn[20]; 何をし[20]ますか?どういう意味ですか?名前を20(50から)に制限しますか、それともprsnfrom prsn[1]を制限しprsn[20]ますか? そして、私がこのようなコードを書いた場合: struct Person { char name[50]; int citNo; float salary; }; struct Person prsn[20]; 同じことをしますか?
8 c  struct 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.