1

C-初心者の質問:

行でクラッシュする次のコードがありますunsigned long rdwValue = *((unsigned long*)pParamPtr);。GCCを使用してfedoraマシンでMIPS32ターゲットのコードをクロスコンパイルしています

unsigned char* pParamPtr = GetNvParamRamAddress(ParameterId, swIndex);

if (0 != pParamPtr)
{
    unsigned long rdwValue = *((unsigned long*)pParamPtr);// CRASHES
}

しかし、私が内部の行をに変更するif

rdwValue = *(pParamPtr);

これは機能します。

この型キャストでルールに反することをしていますか?

pParamPtr必要なのは、 rdwValueで始まるアドレスから4バイト[unsignedlongは4バイト]を取得することです。

それmemcpyは行く方法ですか?

4

1 に答える 1

5

これはどのプラットフォームで実行されていますか?

考えられる理由の1つは、アラインメントの制限に違反していることです。返されたポインターが奇数であり、プラットフォームunsigned longが奇数アドレスからのsの読み取りをサポートしている場合、これは失敗します。

更新コメントによると、OPはこれをMIPSで実行していますが、これには確かにアライメントの制限があります。

マイナーな文体のポイントとして、括弧の外側のペアは必要ありません、それはただである可能性があります:

unsigned long rdwValue = *(unsigned long *) pParamPtr;

バイトを1つずつ読み取るのが最も簡単な場合があります。これにより、エンディアンを明示的に処理することもできます。リトルエンディアン(および少なくとも32ビットのint精度)を想定:

unsigned long rwdValue = pParamPtr[0] | (pParamPtr[1] << 8) | (pParamPtr[2] << 16) | (pParamPtr[3] << 24);
于 2013-02-27T10:02:40.593 に答える