unsigned charポインタを返すLinuxライブラリ(documentation)のSHA1関数を使用したいと思います。私はそれが新しい配列を作成することを理解しているが、私はそれのために使用されるメモリを解放する必要はありませんか?そして、私が自由を使うべきか、[[]を削除するのかをどうやって知っていますか?私はこの特定の関数がメモリを割り当てるCの方法を使用していると思いますが、私はどのように一般的に知っていますか?一部のC++関数は、std :: stringではなくchar配列を返します。シャープポインタ戻り値ごみ
答えて
malloc
を使用してヒープ上のメモリを割り当てている可能性がありますが、関数のスコープ専用の固定長固定長配列へのポインタを返すこともあります。これはLinux上のライブラリ関数、特に再入可能でないライブラリ関数にとっては典型的ではありません。したがって、静的配列を指すポインターにfree()
を呼び出すと、未定義の動作が発生します。以下のためのスペースを持っている必要があり、N dのバイトとMDに 場所それのSHA1メッセージダイジェストを(計算
SHA1():
SHA1()
のドキュメントのこのセグメントから、例えば、 SHA_DIGEST_LENGTH == 20 バイトの出力)。 mdがNULLの場合、ダイジェストは静的配列 に配置されます。戻りポインタは、あなたが
md
引数を介して入力をした配列を指すされようとしているのいずれか、または、md
引数がNULL
であれば、戻りポインタは静的な配列を指しているように、それは私には見えます
関数にプライベート。関数が返すポインタを明示的に解放しなければならないと言われています。
唯一の一般的かつ正解です。ドキュメントをお読みください。使用するすべての外部関数は、そのドキュメントでどのような入力が期待され、どのような入力が返されるかを文書で伝えなければなりません。
malloc
(または同等のもの)で割り当てられたメモリへのポインタが返された場合は、自分でfree
にする必要があります。
(実際には、あなたは時々、おそらくvalgrind
とベースレポートの推測を実行することができるかもしれないが、それは同じくらい、それは当て推量であるように「解決策」ではありません。)あなたが使用する必要があります
evp_* functionsではなく、参照した下位レベルの関数です。ダイジェストを破壊したり作成したりするための機能があります。
unsigned char *SHA1(const unsigned char *d, unsigned long n, unsigned char *md);
文書によると、md==0
ない限り、戻り値はメリーランド。 md==0
の場合は、静的配列に配置されるため、心配する必要はありません。私はそのコンセプトを証明するために休暇を書きました。
#include <openssl/sha.h>
#include <string.h>
#include <stdio.h>
void print_hash(const unsigned char* c)
{
printf("The hash is: ");
int index;
for(index = 0; index < SHA_DIGEST_LENGTH; index++)
printf("%X", *c++);
printf("\n");
}
int main(int argc, char* argv[])
{
unsigned char hash[SHA_DIGEST_LENGTH];
unsigned char str[100];
scanf("%s", str);
unsigned char* sha = SHA1(str, strlen((char*)str), hash);
print_hash(hash);
print_hash(sha);
print_hash(SHA1(str, strlen((char*)str), 0));
}
結果:
some example input
The hash is: EB875812858D27B22CB2B75F992DFFADC1B05C66
The hash is: EB875812858D27B22CB2B75F992DFFADC1B05C66
The hash is: EB875812858D27B22CB2B75F992DFFADC1B05C66
ハッシュが保存されている方法は、あなた次第です。
'md'がNULLの場合は、関数専用の静的配列です。そうしたくない場合は、関数に明示的に記憶域を渡す必要はありません。 – Jason
私はその事実を私の答えに加えました。ありがとう。 – SplinterOfChaos
あなたのコードの問題は、返されたポインタがNULLで終わっている文字列を指していない**であるため、リターンバッファがあふれているということです。あなたは単に20バイトを印刷しなければなりません。それだけです。 – Jason
- 1. 戻り値のみ
- 2. PHP配列の戻り値のみ
- 3. MySQLの戻り値の戻り値
- 4. のprintfは、ごみ値
- 5. 機能取得ごみ値
- 6. IM取得ごみ値が
- 7. 戻り値より
- 8. 戻り値
- 9. ダイナミック戻り値
- 10. 戻り値msfconsole
- 11. 戻り値
- 12. パスカルブール戻り値?
- 13. 戻り値
- 14. 戻り値
- 15. ストア戻り値
- 16. 戻り値php
- 17. 戻り値
- 18. 戻り値は
- 19. 戻り値は
- 20. NotesAgent.Run戻り値
- 21. 戻り値cProfile
- 22. ibatis戻り値
- 23. SQL戻り値
- 24. 戻り値()メソッド
- 25. 戻り値threadExecutor
- 26. C++戻り値
- 27. AsyncTask戻り値
- 28. 戻り値Mybatis
- 29. オーバーライドメソッド戻り値
- 30. 戻り値
削除されたポインタを削除する際にエラーが発生することはありません。 – linuxeasy
しかし、新しいキーワードを使って作成したメモリを解放するとエラーになることはありませんか? – Pijusn
ええと、Kerrekが言っていたように、C++での事はあまり一般的ではないので、ドキュメントを読んでください。 – linuxeasy