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;

as在返回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 回答