問題タブ [flexible-array-member]
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 - 構造体内のサイズのない配列宣言は大丈夫ですか?
の宣言table_type
、具体的にはe[]
:
これは、テーブルの各行の e 要素を出力するだけです。これは明らかに間抜けな出力です。
i=0 j=0 k=4
i=0 j=1 k=9
i=0 j=2 k=10
i=0 j=3 k=11
i=0 j=4 k=12i=1 j=0 k=13
i=1 j=1 k=18
i=1 j=2 k=19
i=1 j=3 k=20
i=1 j=4 k=21i=2 j=0 k=22
i=2 j=1 k=27
i=2 j=2 k=28
i=2 j=3 k=29
i=2 j=4 k=30i=3 j=0 k=31
i=3 j=1 k=36
i=3 j=2 k=37
i=3 j=3 k=38
i=3 j=4 k=39i=4 j=0 k=40
i=4 j=1 k=45
i=4 j=2 k=46
i=4 j=3 k=47
i=4 j=4 k=48i=5 j=0 k=49
i=5 j=1 k=50
i=5 j=2 k=51
i=5 j=3 k=52
i=5 j=4 k=53
の場合、最後のブロックで正しいことに注意してくださいi=5
。に置き換えるe[]
とe[5]
、出力はすべて正しいです。CCS C Compiler と Microchip マイクロコントローラを使用しています。これがバグなのか、それとも何なのか気になりました。
c - C の柔軟な配列と逆参照型のパンニングされたポインター エラー
以下のコードをコンパイルしようとすると、#3 で「逆参照すると、厳密なエイリアス規則が破られます」gcc -O3 -Wall -Werror -std=c99 main.c
のようなエラーが表示されますが、#2 または #1 では表示されません。型抜きされた "char *" を逆参照できますが、柔軟な配列で同じことができないのはなぜですか?
編集1: 以下に問題を示すより具体的な例があります:
c - 柔軟な配列メンバーを構造体として割り当てる
ポインターなどについては理解していますが、ここで何が間違っているのかわかりません。if i Have char *(*data)[] それは「char ポインターの配列へのポインター」として解釈されるだけですよね?それから私はこのような構造体を持っています.typedefはmyStructになるように指定されていますが、それは冗長かもしれませんが、それは重要ではありません:
似たような記事がないかサイトを見て回ったところ、次のようなものがありました。
構造体に割り当てた数は、配列のサイズであると確信しています。これについて頭を悩ませることはできません。構造体の場合、どのように機能しますか? ここでの計画は、この構造体を持つことであり、5 つの myStruct の配列が含まれています。それらも別々に割り当てる必要がありますか?このような?
試してみましたが、境界が指定されていない配列の無効な使用というエラーが表示され続けます。何が間違っているのか、どうすれば修正できますか? ありがとうございました
c - devm_kzalloc に関する問題
devm_kzalloc() 関数の実装を理解しようとしています。リソースを管理するために、要求されたメモリ (sizeof(struct devres) + size) を超えるメモリを割り当てています。
struct devres は次のように定義されています。2 番目のメンバーは不完全な配列です。
以下は、メモリを割り当てるソースです。
以下の疑問があります。. tot_size を計算していますが、struct devres では配列が不完全です。. devm_kzalloc() 関数 (以下を参照) は、要求されたメモリの開始として dr->data を返しています。配列名にその配列の開始アドレスが含まれていることがわかっている場合は、要求されたメモリよりも多くを割り当てています。つまり、unsigned long long + size のサイズです。
これを理解するのを手伝ってくれませんか。
memory-management - Rustで大量に割り当てられたヒープメモリを分割して使用する方法は?
私は最近 Rust について多くのことを読みましたが、まだ酸化し始めたばかりです。私の脳はほとんどの C/C++ 反射神経を保持しているため、Rust での処理方法が原因でこの質問が関係ない場合はご容赦ください。
一般に、任意のサイズのブロックをヒープに割り当ててから、メモリの小さなチャンクの所有権を取得するバインディングを使用してデータ構造をその上にマップすることは可能ですか (望ましいですか?)。
C99 を使用すると、次のように記述できます。
可変長の配列は、可変サイズのチャンクでメモリ プールを実装する場合や、スレッド専用のヒープにメモリを割り当てる場合などに役立ちます。必要なサイズが実行時にしか分からないデータ構造は、「アトミック」な方法で割り当てられ、そのメンバーは連続してパックされます。
同様の Rust の実装が (unsafe
構成要素なしで) 可能かどうか、可能であればどのように見えるか疑問に思っています。たぶん、コンパイラは定義でライフタイム指定子を使用していくつかの情報を推測するかもしれませstruct
んか?
c - 柔軟な配列メンバーの静的初期化が機能するのはなぜですか?
メニュー用に次の基本的なコードを作成しました。
関連するいくつかの質問を閲覧すると、柔軟な配列メンバーを使用する唯一の方法は、メモリを動的に割り当てることです。ただし、私のコンパイラは、エラーや警告なしでコードをコンパイルして実行することに完全に満足しています。これは禁句ですか?
MinGW gcc 4.6.1 を使用し、C99 ルールでコンパイルしています。
c - Cで整数とジェネリックポインタの両方を保存する最も移植性の高い方法は何ですか?
私はシステムを開発しています(仮想マシン?これを呼び出す方法がわからない)すべてのデータ構造が配列(または構造体)であり、先頭に3つの整数フィールドがあります(これはバイトをパディングせずに次々と先頭にある必要があります)およびnジェネリック ポインター。私はこれについて多くのことを考えましたが、明確な解決策を見つけるのは難しいようです.
以下は私の最初の試みです。
void *
ここでは、整数へのキャストが安全かどうかわかりませんでした。少し勉強した後、次のようにコードを変更しました。
しかし、一部のプラットフォームでsizeof(void *)
はsizeof(uintptr_t)
. そこで、これを構造体に変更することにしました。
ここで、C には 100% 移植可能なジェネリック ポインターがないという問題を発見しましたが、その解決策を見つけることができないので、いくつかの異なるポインター サイズを持ついくつかの奇妙なプラットフォームを無視させてください。
a が任意のオブジェクトへのポインターを格納できることを考えると、void *
私の最後の解決策は私の目的を満たしていますか? 私は柔軟な配列メンバーにあまり慣れていないので、間違いを犯した可能性があります。または、まだ見落としている点があるかもしれません。
どんな助けでも感謝します。
c - ネストされた構造体の柔軟な配列メンバー
ネストされた構造体内に柔軟な配列メンバーを持つことは有効な C コードですか? 以下のサンプル コードは、正常なコンパイラで期待どおりに動作することが保証されていますか?