質問

Cに関してはいくつか問題があります。これが私のコードです:

// First line works, second line does not! 
char outbuf[1024];
// char *outbuf = (char *) malloc(1024);  // char is always 1

この outbuf を というメソッドに渡します PK11_CipherOp(), 、NSS ライブラリで宣言されています。このメソッドのドキュメントは次のとおりです。 ここ, を期待していることがわかります。 char * outbuf パラメータ用。

最初の行は確実に機能するのに、2 行目は機能しない理由が理解できません。

完全なコードを確認するには、を参照してください。 ファイルソース

ありがとう、

ハミルトン

役に立ちましたか?

解決

あなたの問題は、次の宣言が欠落しているようです malloc - 含めていない <stdlib.h>.

これは、コンパイラが関数が返すと想定していることを意味します。 int, 、次に明示的にキャストされます (unsigned char *). 。プラットフォーム上にいる場合 sizeof(int) != sizeof(void *), x86-64 と同様に、これによりポインター値がマングルされます。

これは、(C++ とは異なり) C で次のことを行う必要がある理由を完全に示しています。 ない の結果をキャストする malloc() - そうすることは不要であり、この正確なバグをあなたから隠します。また、コンパイラ警告をオンにする必要がある理由も説明します。

修正するのは、 #include <stdlib.h>, からキャストを削除します。 malloc() あなたがそこにいる間。

補遺:

もう一つの問題は、合格することです sizeof(outbuf)PK11_CipherOp(). 。これは正しいでしょう (次と等しい) out_buf_size) いつ outbuf は配列ですが、正しくありません (配列のサイズ ポインタ自体) いつ outbuf はポインタです。

それぞれ交換してください sizeof(outbuf)out_buf_size これで準備完了です (後でもう 1 つあります)...

他のヒント

問題を発見しました。私は、パラメータの1つとしてsizeof(outbuf)を使用していたことが分かりました。 outbufには、スタック上で宣言されている場合は、char outbuf[1024];としてはoutbufのはoutbufのサイズは、多くの部屋がoutbufをで利用できたかだけ4.このパラメータは、関数を語っているchar * outbuf = malloc(1024);として、ヒープ上にあるとき、しかし、1024を返すので、機能はそれだけで部屋の4つのバイトを持っていたことを考えました。それだけですべての作業を実行せずに返されたので、それはの何でもの行うために16を必要とします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top