問題タブ [realloc]
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を使用してファイルから情報を動的に保存する
私はCに不慣れで、いくつかのことを学ぼうとしています。私がやろうとしているのは、ファイルを読み込んで情報を保存することです。フォーマットはCSVとなるため、各文字を読み込み、数字かカンマかを判断し、リンクリストに格納する予定です。私が抱えている問題は、次の例のように1文字以上の数字を読み取ることです。
5,2,24,5
これが私がこれまでに得たコードであり、それは私が期待する出力を返さないだけです。これがコードで、出力はコードサンプルの下にあります。
そしてここに出力があります:
トークンの長さが1であると予想されるのに、なぜトークンの長さが「5」であり、5に続く奇妙な文字(「a#」で表される)であるのかわかりません。誰かが私がこれをもう少しよく理解するのを手伝ってもらえますか?
c - realloc を使用して割り当てられたメモリを縮小する
C の realloc 関数に関する簡単な質問: realloc を使用してポインターが指しているメモリ ブロックを縮小すると、「余分な」メモリは解放されますか? それとも、何らかの方法で手動で解放する必要がありますか?
たとえば、
メモリリークは発生しますか?
c - realloc() を何度も使用する
次のうちどれが好ましいか
またはこれ
c - 関数内で配列を再割り当てする
関数内で配列を再割り当てしようとしています。
この関数の外で配列を印刷しようとすると、ar がメモリ内の別の場所を指すようになったため、機能しません。関数内で再割り当てし、関数外の同じ場所を指すにはどうすればよいですか?
PS: Sa* は構造体へのポインタです
c - realloc()は組み込みシステムで安全ですか?
組み込みシステム用のソフトウェアを開発している間、私はrealloc()
何度も関数を使用しました。今、私はrealloc()
何の説明もなく「組み込みで使用すべきではない」と言われています。
realloc()
組み込みシステムにとって危険であり、その理由は何ですか?
iphone - iPhone上のOpenGLES2.0:小さなインデックス/頂点数を超えることができません
簡潔にしようと思います。私はiPhoneでOpenGLES2.0を使用しており、VertexBufferObjectを使用して画面上に一度に多くの形状をレンダリングしています。
一連のゼロ上向きのインデックスがに使用されGL_ELEMENT_ARRAY_BUFFER
、これらは次の場所に格納されます。
各形状には頂点数があります。新しい形状が作成されると、合計頂点数'vxCount'がixDataのメモリを再割り当てするために使用されます。
もちろん、ixDataの初期mallocもあります。
各形状には6つの頂点属性(2つの位置、4つの色)があり、これらはすべてGLfloat
です。各形状には、合計24個の頂点があります。vector<Shape>
コードはC++であるため、形状はに格納されます。値vxCount
は、この形状ベクトルのサイズに形状ごとの頂点の数を掛けることによって計算されます(つまりshapes.size()*24
)。
各シェイプの位置はフレームごとに変わるため、各レンダリングでglDrawElementsを呼び出す直前にバッファデータを再送信します。
このアプリは、508までの任意の数の図形に最適です。ただし、509番目の図形を追加しようとするEXC_BAD_ACCESS
と、インデックスバッファーデータ用に取得されます。上記のコードでは、関連する行にアスタリスクが付いています。
上記のコードのNSLogプリントアウトを以下に示します。ご覧のとおり、最新の割り当てられた頂点カウントは、プリミティブインデックスの送信時のカウントと一致しています。
..。
2011-08-31 20:35:59.438 nibfree [26409:707] 503形状、12072頂点にixDataを割り当てます
2011-08-31 20:35:59.441 nibfree [26409:707] 504の形状、12096の頂点にixDataを割り当てます
2011-08-31 20:35:59.444 nibfree [26409:707] 505の形状、12120の頂点にixDataを割り当てます
2011-08-31 20:35:59.448 nibfree [26409:707] 506の形状、12144の頂点にixDataを割り当てます
2011-08-31 20:35:59.451 nibfree [26409:707] 507の形状、12168の頂点にixDataを割り当てます
2011-08-31 20:35:59.454 nibfree [26409:707] 508の形状、12192の頂点にixDataを割り当てます
2011-08-31 20:35:59.457 nibfree [26409:707] 509の形状、12216の頂点にixDataを割り当てます
2011-08-31 20:35:59.746 nibfree [26409:707]レンダリングvxcountは12216です
〜12kの頂点はデバイスにとって問題ではなく、インデックスデータのタイプは、 0〜65535のGLushort
頂点インデックスが可能であることを意味します。
私は本当に困惑しています、誰かが何が間違っているのか推測できますか?iPhone固有の頂点/インデックスバッファの制限を超えていますか?
アップデート
洞察を追加するために、形状サイズを24頂点から12頂点に半分にしました。その後、再試行し、制限に達しました1536 shapes, 18432 vertices
。シェイプごとに12の頂点を持つ1537のシェイプを追加しようとすると、以前と同じように。でクラッシュしEXC_BAD_ACCESS
ます。
この最新のテストは、vxData / ixDataストレージが問題ではなく、頂点または頂点インデックスの数に制限がないことを示しています。可能な形状の数はおよそ3倍に増加しました-これは、私が遭遇しているGL_TRIANGLESレンダリングの癖を示唆していますか?それとも、reallocの誤用ですか?なぜそれが問題なのかよくわかりません:(
更新2
パターンを見つけるための別の数字のセット:300の頂点には最大61の形状があり、62はクラッシュを引き起こします。62には、vxcount 18300、最後のixDataインデックス18299があります。
c - Cでの奇妙なメモリエラー
循環シンボリックリンクをチェックするプログラムをCで書いています。戦略は、structfileInfoを作成することです。
これにより、ファイルのiノードとdevIDが保存されます。これらの構造体の配列を作成し、新しいファイルを開く前に、ファイルがすでに存在するかどうかを毎回チェックします。もしそうなら、それは循環リンクです。
ただし、func2()を数回呼び出した後、メモリリークが発生し、fileDataが何も指していないことに気付きました。func2()で何も解放しないので、リークがどこから来ているのかわかりません。いくつかのrealloc
シェナニガンがあると思いますが、その理由はわかりません。助けていただければ幸いです!
c - C で動的メモリ割り当てを使用する構造体
データの長さがデバイスに送信するコマンドに依存する構造にデータを書き込む必要があります。そのために、次の構造を定義しました。
注:メンバーcmd、 *data_length* 、およびcrcは常に存在しますが、メンバーデータは空にすることも、最大 12 バイトまで含めることもできます。
関数に渡されたパラメーターに従って、初期化されたコマンドを返す関数を作成しました。
関数 get_cmd() は次のように使用されます。
このコードをコンパイルしようとすると、その行のコンパイラからエラーが発生します。
コンパイラエラーは次のとおりです。
realloc()を使用する目的は、配列データのサイズを変更するか、新しいコマンド構造からまったく削除することです。私のコードで何が間違っていますか? 動的メモリ割り当てで構造体を初期化する正しい方法ですか?
c - realloc はメモリを拡張するだけですか、それともメモリの問題につながる可能性がありますか?
次のコードがあります。
出力:
出力から、realloc
は新しいメモリ アドレスへのポインタを返します。
それで問題は、オリジナルによって作成された場所を解放する以外に、この場所を明示的に解放する必要があるmalloc
かどうかです。
または、上記のコードが望んでいたことを実行していJust expand the memory location reserved previously
ますか?
ありがとう。
EDIT
: 実際、以下の各回答は貴重な情報を提供してくれました。そして、受け入れる回答を 1 つだけ選択する必要があるためです。上記のコードを修正したものを選択しました!