問題タブ [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++ - boost::shared_array の再割り当て
私は shared_array を持っています: boost::shared_array myarr(new char[m_length]);
配列を再割り当てしたいと思います。必要なサイズで新しい shared_array を作成し、スワップ ブースト メソッドを使用することを考えましたが、これは参照カウントもコピーします。別のアイデアはありますか?
c - 動的な多次元配列の再割り当て
機能に問題がありrealloc
ます。
この関数を使用して、動的な二次元配列を割り当てています。
次のコードで呼び出されます。
これにより、2 次元配列 1* MATRIX_X_SIZE が正常に作成されます。
次に、行列に行または複数の行を追加したいのでrealloc
、次の関数で使用します。heightIncrement
行を追加することになっています。問題は、動作することもあれば、プログラムがクラッシュすることもあります。
この関数は次のように呼び出されます。
私は何を間違っていますか?
以前に割り当てられたメモリ ブロックの割り当てを解除する関数:
前もって感謝します。
編集
- 愚かな私。
realloc
Karl Knechtel が指摘したように、私は の戻り値で何もしていませんでした。しかし、今では実行するたびにプログラムがクラッシュします。 - Bart van Ingen Schenau の回答で、私が恐れていたことを確認しました。以前に割り当てたいくつかの独立したメモリ ブロックを無視していたのです。Bart によって書かれたものと同様のコードになってしまいましたが、引き続きプログラムをクラッシュさせます。
- /呼び出し
assert
の結果を確認するために 's を追加しましたが、うまくいきませんでした。私は Win98 で djgpp を使用していますが、何が起こっているのかは本当に奇妙です:malloc
realloc
- Windows: クラッシュしないこともあります。それ以外では、2 行追加するとクラッシュします。
- MS-DOS: 2 行を追加するとクラッシュします。追加の手がかりを得るために、gcc で -O3 を使用してみます。Windows 用の便利な (そしてすぐに習得/使用できる) メモリ破損/リーク検出ツールは何でしょうか? Purify は最適なソリューションですか?
- 配列を解放する関数でさえ、ページ フォールトを返しています。
c - 割り当て問題のない realloc()
クラスメートの 1 人がコードを送ってきて、何が問題なのか尋ねました。それは次のようなものでした:
ユーザーから数字を取得し、素数の数字を保持して、最後にそれらを出力することになっています。私のコンピューターの出力は次のようなものです。
コードには他にもありましたが、最大の問題は明らかに realloc() の戻り値を割り当てていないことです。しかし、奇妙なことは、私の質問ですが、なぜこのコードは最初の素数が正しくなく、他の素数が正しく表示されるのでしょうか? 動的配列のアドレスは変更される可能性がありますが、最初のものではなく、2 番目のものと残りの部分が正しいのはなぜですか?
編集:わかりました、私がこれを尋ねた理由は、このコードでの realloc() の動作を理解しようとすることでした。適切なリソースがあれば共有してください。メモリを再割り当てするとき (古いメモリを解放するとき)、realloc() は古いメモリ位置の内容を変更しますか?
c - C配列の質問-再割り当てされたメモリに関する奇妙なメモリの問題
この問題を説明する方法が正確にはわかりません。それは非常にランダムです。
私はここにいくつかのコードを投稿しています:http://pastebin.com/d2vzas5S
問題は54行目にあります。技術的には、main()のテストコードに基づいてifステートメントを入力しないでください。テストコードは、配列内の新しいスロットへのポインタを追加し、割り当てを解除して、再度実行しているためです。
奇妙なのは、ifステートメントがメインの配列(array2)の2番目のテストでtrueと評価されているのに、明らかにそうではないということです。
私は完全に明白な何かを見逃しているに違いありません-または、私が気付いていないヒープ/スタックで起こっている奇妙なことがいくつかあります。
何か案は?
c++ - null を返す Realloc?
malloc でメモリを割り当てます - 約 128 バイト。
後で、約 200 バイトで realloc を呼び出しますが、null が返されます!
解放すると有効なポインターが返され、次に別の malloc が返されますが、realloc を使用したいと考えています。
この動作を説明できるものは何ですか (明らかにメモリ不足ではありません)。これは有効な動作ですか?
コードビット:
}
編集:修正。クラスの << 演算子をオーバーロードしていて、void ではなく *this を返すようにしました。どういうわけか、これはすべてを台無しにしていた!誰かがなぜこれが起こるのか説明できれば、それは素晴らしいことです!
c - C99 の柔軟な配列
注:元の質問をより明確にするために書き直しました。
という関数があります
vcf は私が読み取るオープン ファイルで、cardp はカードの配列の先頭へのポインタです。ファイルには複数のカードが含まれます。
readVCard は一度に 1 行ずつファイルを読み取り、関数 parseVcProp を呼び出して行内のキーワードを識別し、それらを構造体の適切な場所に割り当てます。
ここに構造があります
ファイルには複数のカードが含まれ、カードには複数のプロパティが含まれます。
問題は、1 枚のカードが任意の数のプロパティを持つことができるということです。それらを読み終えるまで、いくつあるかはわかりません。
これが私が理解していないことです。
parseVcProp を適切に使用するには、メモリをどのように割り当てる必要がありますか?
parseVcProp を呼び出すたびに、データを新しい構造体に格納したいのは明らかですが、このメモリを事前に割り当てるにはどうすればよいですか? malloc(sizeof(VcProp)*1) だけですか?
c - C 文字列を 2 次元配列に保存する
アイデアは、EOF に達するまで (この形式で"string - string"
) 標準入力から文字列を読み取ることです。次に、文字列を 2 つの文字列に分割し、2 次元配列に保存します。配列は、最初は 2 行 20 列で動的に割り当てられますが、次の文字列を追加するたびに 2 行追加したいと思います (関数expandmat()
)。これが私のコードです:
また、このコードに意味をなさない箇所があれば、それを修正する方法を教えていただけますか?
これは些細な作業のように思えますが、私は頭がおかしくなりました。
ご協力いただきありがとうございます。
c - 再割り当てが失敗する可能性はどのくらいですか?
同様に空きメモリが不足すると失敗しますか、malloc
それとも他の理由が考えられますか?
c - さまざまなサイズの構造体を持つ構造体配列のmalloc()
各構造体にサイズが異なる文字列の配列が含まれている場合、構造体の配列を正しくmallocするにはどうすればよいですか?
したがって、各構造体のサイズが異なる可能性があり、
realloc(numberOfStructs * sizeof(structName))
後
malloc(initialSize * sizeof(structName)
これにメモリを割り当て、何が起こっているかを追跡するにはどうすればよいですか?
c - 整列されたメモリ管理?
アラインされたメモリ ブロックの管理についていくつか質問があります。クロスプラットフォームの回答が理想的です。ただし、クロスプラットフォームのソリューションが存在しないことは確かなので、主に Windows と Linux に関心があり、(はるかに) 少ない範囲で Mac OS と FreeBSD に関心があります。
メモリのチャンクを 16 バイト境界に整列させる最良の方法は何ですか? (私は
malloc()
、少し余分なスペースを割り当ててから、適切に位置合わせされた値までポインターをバンプするという簡単な使用方法を認識しています。問題。)単純な古い を使用し
malloc()
、余分なスペースを割り当ててから、ポインターを正しく配置される場所に移動する場合、解放のためにポインターをブロックの先頭に保持する必要がありますか? (ブロックの中央へのポインターの呼び出しfree()
は、Windows では実際に機能するようですが、標準が何を言っているのか、標準ができないと言っていても、すべての主要な OS で実際に機能するかどうか疑問に思っています。私はあいまいなDS9Kのような OSは気にしないでください。)これは難しい/興味深い部分です。整列を維持しながらメモリブロックを再割り当てする最良の方法は何ですか?
malloc()
理想的には、これは を呼び出し、コピーfree()
してから古いブロックを呼び出すよりもインテリジェントなものになります。出来ればその場でやりたい。