問題タブ [compound-literals]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 参照される複合配列リテラルの有効期間
私は最近、Cで複合リテラル配列への参照を実際に使用できることを知りました。これは便利だと思いますが、それがどのように機能するかはよくわかりません。
たとえば、次のように、戻り名の長さを気にしないソケットインターフェイス関数を呼び出すために変数を宣言する必要がないように、この機能を使用するとします。
明らかsizeof(ss)
に、スタックへのポインタをに渡すには、実際にスタックに格納する必要がgetpeername
あります。したがって、スタック上のスペースは、その目的のために割り当てて予約する必要がありますが、この割り当ての存続期間はどのくらいですか?割り当てられたままであるとどのくらい信頼できますか?
GCCのアセンブリ出力を見ると、呼び出しをgetpeername
ループに入れた場合、割り当てはループの複数の反復で存続しないことがわかりますが、他のどのような条件でそれが存在しなくなる可能性がありますか?
c - 複合リテラルがループ内のポインターに割り当てられるたびに、新しいオブジェクトが作成されますか?
C99 標準6.5.2.5 .9によると、コードは次のとおりです。
2 つの int の配列の最初の要素を指すように p を初期化します。最初の要素の値は 2 で、2 番目の要素は 4 です。この複合リテラルの式は定数である必要があります。名前のないオブジェクトの保存期間は静的です。
しかし、次のようなことをするとどうなるでしょうか。
ループの各反復で新しいunnamed object
作成ですか、それとも各反復で同じオブジェクトが使用されますか?
次のようにすると、結果は異なりますか。
可能なオプションは 2 つあります。ループが繰り返されるたびに新しいオブジェクトが作成されるか、ループの繰り返しごとに同じオブジェクトが使用されます。
この状況での動作が標準に書かれていることから何らかの形で演繹できるのか、それともコンパイラが決定するのかに興味があります。
次のコードを使用して、gcc 4.1.2 でテストしました。
結果は次のとおりです。
0x7fff4c0010a0 0x7fff4c0010a0 0x7fff4c0010a0 0x7fff4c0010a0 0x7fff4c0010a0 0x7fff4c0010a0 0x7fff4c0010a0 0x7fff4c0010a0 0x7fff4c0010104
私はカフェの答えをチェックするためにいくつかのコードを書きました:
結果は次のようになります (メモリエラーを検出するために valgrind で呼び出されます):
したがって、リテラルは宣言された関数内でのみ使用でき、関数を離れた後にスコープ外になり、その後、それらにアクセスすることは未定義の動作です。
c - Cの複合リテラルの配列にいくつの要素があるかを判断する方法は?
複合リテラルの配列に含まれる要素の数を確認するにはどうすればよいですか。私はよく知られているマクロを使用していますsizeof(a)/sizeof(a[0]);
が、1
.
c - #定数構造体を定義する
私が構造体を持っているとしましょう:
次に、後でプログラムで使用する無効な場所を定義したいと思います。
ただし、プログラムでそれを使用すると、エラーになります。
これはコンパイルされません。そのように複合リテラルを使用することは合法ではありませんか? エラーが発生します:
バイナリ式のオペランドが無効です ('struct location' および 'struct location')
c - 引数としての「複合リテラル」
sum(int [], arr_size)
ステートメントで関数を呼び出す
複合リテラル が (int []){1,2,3,4,5}
引数として渡されます。配列の長さがリテラルの要素の数によって決定されることは明らかです(これはもちろん5
ここにあります)。5
それでは、別の引数として 渡す必要は何ですか?
上記の関数を次のように定義できませんか
そしてそれを次のように呼び出します
?
c - 複合/文字列リテラルはメモリのどこに格納されますか?
私はそれを読みました;
複合リテラルは、名前のない配列を作成するために使用できる C99 機能です。例を考えてみましょう:
p
3, 0, 3, 4
、およびを含む 5 要素配列の最初の要素を指し1
ます。
実際に知りたいのですが、名前がないので、この配列はメモリに保存されますか?
つまり、
文字列"hello"
はメモリのどこに保存されますか?
c - 匿名の構造体 + 複合リテラルで lint エラーが発生する
組み込みの C99 互換プログラムに複数の構造体 (マイクロチップ コンパイラで使用される定義の型をモデルにしていますが、これはマイクロチップ アプリケーションではありません) があります。典型的な例を次に示します。
CommandDirection_t と RigisterAddress_t は列挙型です。コードの後半で、構造体を宣言して初期化します。
これは警告やエラーなしでコンパイルされますが、ファイルをリントすると、「エラー 65: メンバー名が必要です」というエラーが表示されます。
lint エラーが発生しないようにコードを微調整するにはどうすればよいですか、またはこれに対する lint 警告を無効にするにはどうすればよいですか (エラー 65 を無効にする以外に)。
c - 引数として渡された複合リテラルの寿命は?
これは、clang を使用して警告なしでコンパイルされます。
これは有効なCですか?
もしそうなら: 複合リテラルの寿命は?
ios - 奇妙な構文の説明が必要
私はチュートリアルに従って、このコードを見つけます:
それが何をするのかはかなり明確ですが、このコード行の構文がわかりません。初めてこのようなものを見ました: .size = image.size
. ドット構文では、 のようにドットの前に何かが表示されることを期待していますが、self.view
の意味は.size
何ですか?
2 番目の質問は、なぜ丸括弧があり、その後に中括弧があるのですか? そのような構造は今まで見たことがありません(){};
。
私の質問はばかげているように聞こえるかもしれませんが、今は少し混乱しています。誰か説明してもらえますか? ありがとうございました。