0

JSON テキストを解析し、EZapiEntry という新しい構造を返す関数があります。結果の値を確認すると、すべて問題ありません。

athor cファイルでこの関数を使用した後。間違った結果が得られます。

関数のコード:

EZapiEntry parseEntry()
 {
    EZapiEntry   result;
    json_t      *entryJson;
    entryJson = json_object_get(root,"data");
    unsigned int i=0;
    EZuc8* maskString=json_string_value(json_object_get(entryJson,"mask"));
    result.uiKeySize = json_integer_value(json_object_get(entryJson,"keySize"));
    result.uiResultSize = json_integer_value(json_object_get(entryJson,"resultSize"));
    EZuc8 val1[result.uiKeySize];   
    hexStringToBytes(json_string_value(json_object_get(entryJson,"key")),val1);
    result.pucKey = val1;   
    EZuc8 val2[result.uiResultSize];
    hexStringToBytes(json_string_value(json_object_get(entryJson,"result")),val2);  
    result.pucResult = val2;
    EZuc8 val3[strlen(maskString)];
    hexStringToBytes(maskString,val3);  
    result.pucMask = val3;
    result.uiProfile = json_integer_value(json_object_get(entryJson,"profile"));
        printf("\nkeySize :  %u  ",result.uiKeySize);
        printf("\nResultSize :  %u  ",result.uiResultSize);
        printf("\nkey :    ");
        for (i = 0 ; i <result.uiKeySize ; i++)
        {
            printf("%02x",result.pucKey[i]);
        }
        printf("\nresult :    ");
        for (i = 0 ; i <result.uiResultSize ; i++)
        {
           printf("%02x",result.pucResult[i]);
        }
        printf("\nmask :    ");
        for (i = 0 ; i <strlen(maskString) ; i++)
        {
          printf("%02x",result.pucMask[i]);
         }  
        printf("\nprofile :    ");
        printf("%u",result.uiProfile);  
    return result;
 }

関数の使用コード:

 entry=parseEntry();
   printf("\nkeySize2 :  %u  ",entry.uiKeySize);
   printf("\nResultSize2:  %u  ",entry.uiResultSize);
   printf("\nkey2 :    ");
    for (i = 0 ; i <entry.uiKeySize ; i++)
    {
       printf("%02x",entry.pucKey[i]);
    }
   printf("\nresult2 :    ");
    for (i = 0 ; i <entry.uiResultSize ; i++)
    {
       printf("%02x",entry.pucResult[i]);
    }
   printf("\nprofile2 :    ");
   printf("%u",entry.uiProfile);

そして、これは結果です:

keySize :  1  
ResultSize :  16  
key :    03
result :    aaaaaa11445544ff00112233445544ff
mask :    0000000a
profile :    0
keySize2 :  1  
ResultSize2:  16  
key2 :    bf
result2 :    bfb985b0102e765c00112233445544ff
profile2 :    0

たとえば Result1 の最初の値は正しい値です。二番目は間違ってる

私は本当にスタックしています、私は問題を見つけることができません! ヘルプはありますか?

4

1 に答える 1

1

これにより、関数が返された後にダングリング ポインターが発生します。

EZuc8 val2[result.uiResultSize];
hexStringToBytes(json_string_value(json_object_get(entryJson,"result")),val2);  
result.pucResult = val2;

戻ってくるval2ともう存在しませんparseEntry()val1との同様の問題val3malloc()関連するメンバーに直接VLA を使用する代わりに:

result.pucResult = malloc(sizeof(EZuc8) * result.uiResultSize);
hexStringToBytes(json_string_value(json_object_get(entryJson,"result")),
                 result.pucResult);

free()動的に割り当てられたメモリに注意してください。

于 2012-04-29T22:26:05.470 に答える