我有一个解析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的第一个值是正确的值。第二个是错误的
我真是堆叠,我找不到问题! 有帮助吗?
答案 0 :(得分:1)
这将在函数返回后产生悬空指针:
EZuc8 val2[result.uiResultSize];
hexStringToBytes(json_string_value(json_object_get(entryJson,"result")),val2);
result.pucResult = val2;
当val2
返回时, parseEntry()
将不再存在。 val1
和val3
的类似问题。而不是直接将VLA malloc()
用于相关成员:
result.pucResult = malloc(sizeof(EZuc8) * result.uiResultSize);
hexStringToBytes(json_string_value(json_object_get(entryJson,"result")),
result.pucResult);
请记住free()
动态分配的内存。