2012-04-29 2 views
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 является правильным. Второй неправильный

Я действительно стек, я не могу найти проблему! Есть ли помощь?

ответ

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() динамически распределяемой памяти.

Смежные вопросы