0
/*HASHING*/
unsigned char *do_hashing(unsigned char *buffer){
    unsigned char outbuffer[20];
    unsigned char output[20];
    SHA1(buffer, strlen(buffer), outbuffer);

    for (int i=0; i<20; i++) {
        output[i]=outbuffer[i];
    }

    printf("The hash: ");

    for (int i = 0; i < 20; i++) {
          printf("%02x ", outbuffer[i]);
    }

    printf("\n");

    return output;
}
/*HASHING*/

printf 関数を削除すると、この関数が異なる出力 (間違った出力) を生成するのはなぜですか。例えば:

./ftest
The hash: a1 2a 9c 6e 60 85 75 6c d8 cb c9 98 c9 42 76 a7 f4 8d be 73 
The hash: a1 2a 9c 6e 60 85 75 6c d8 cb c9 98 c9 42 76 a7 f4 8d be 73 
=with for-loop print

./ftest

The hash: 6c 08 40 00 00 00 00 00 0a 00 00 00 00 00 00 00 00 00 00 00
=without for-loop print

この場合、この関数内でエラーが発生するため、main-function または #includes は含めていません。

4

2 に答える 2

7

ローカル変数へのポインターを返していますunsigned char output[20];

関数が終了した後に変数が存在しないため、未定義の動作が発生します。

于 2013-03-27T15:23:22.773 に答える
1

現時点では、(スタックに配置されている) ローカル ポインターを返しています。これにより、未定義の動作が発生します。

やりたい場合はmalloc()関数を使ってヒープにメモリを確保してください。

unsigned char* output = malloc(20*sizeof(unsigned char));

ただし、割り当てられたメモリを解放するために呼び出すことを忘れないでくださいfree()。そうしないと、メモリ リークが発生します。

于 2013-03-27T15:32:15.887 に答える