2

dsPic30/33 および 18E/F パーツは、奇数アドレスのメモリに 16 ビット アクセスが行われると、メモリ フォールトを生成します。malloc() を使用してヒープ メモリを割り当てる場合、リターン アドレスはワード アラインされることが保証されますか? (つまり偶数)

malloc は、単語ではなくバイト単位で引数を取ることを思い出してください。

私が見つけたドキュメント (16 ビット言語ツール ライブラリ リファレンス マニュアル 50001456J.pdf) は、この問題については沈黙しています。

==== 編集: 私は malloc() から偶数 (ワードアラインされた) アドレスしか受け取ったことがないので、これまでのところすべてうまく機能していることを付け加えておきます。それにもかかわらず、奇妙なアドレスを取得すると、私のコードはトラップを引き起こします (私は のようなことを実行するため((uint16_t *)foo)[3] = 20000;)。したがって、malloc() によって常にアドレスも返されるようにしたいと考えています。

4

3 に答える 3

2

C 標準では、malloc() は、割り当て内に収まる可能性のあるオブジェクトの実装によって課されるメモリ アラインメント要件を満たすポインターを返さなければならないことを義務付けています。コンパイラがすべてのメモリ アクセスをアラインメントに関係なく機能する方法で処理する場合、malloc() 実装は任意のアラインメントを持つポインターを返す可能性があります。実際、多くの実装では、必要なアラインメントがそれほど粗くない場合でも、2、4、または 8 バイトの倍数でアラインされたポインターを返します。実装は、そのような動作が変わらないことを期待すべきではないことを明示的に約束します。

于 2016-08-17T22:39:00.637 に答える
1

Microchip は、サポート チームを通じて、XC16 の malloc() と realloc() が常に偶数アドレスを返すことを確認しています。

于 2016-11-23T19:32:46.843 に答える