使用返回自定义结构的函数时出错

时间:2012-04-29 22:18:54

标签: c json

我有一个解析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的第一个值是正确的值。第二个是错误的

我真是堆叠,我找不到问题! 有帮助吗?

1 个答案:

答案 0 :(得分:1)

这将在函数返回后产生悬空指针:

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

parseEntry()将不再存在。 val1val3的类似问题。而不是直接将VLA malloc()用于相关成员:

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

请记住free()动态分配的内存。