У вас есть проблемы с памятью:
int main(void) {
char* s = NULL;
json_t *root = json_object();
Вы запрашиваете новый объект JSON немедленно на первой итерации вашего l oop. В этом случае объект, созданный этим вызовом функции, становится недоступным. Это утечка памяти.
int myNum[10] = {10, 20, 10, 40, 10, 60, 10, 80, 10, 100};
for(int i=0; i<10;i++)
{
if(i%2==0)
{
json_t *root = json_object();
}
char *key = (char*)malloc(2);
snprintf(key, sizeof(key), "%d", myNum[i]);
Это записывает 3 байта в память, которая может содержать только 2 байта.
json_object_set_new( root, key, json_integer(i));
s = json_dumps(root, 0);
puts(s);
if(i%2==0){
json_decref(root);
После этого вызова вы больше не можете использовать root
. Указанный объект, вероятно, будет освобожден после уменьшения счетчика ссылок. Если вы попытаетесь добавить новый объект на следующей итерации, у вас не будет действительного объекта. Это может вызвать ошибку сегментации.
//free(s);
}
}
}
Чтение вашего описания
если индекс даже индексируется, объект json должен быть освобожден и снова новый объект должен быть построен
Это правда, но вы не делаете этого так.
Чтобы решить вашу проблему, либо
- только бесплатно в конце итерации для нечетных чисел
- запросить новый объект сразу после
json_decref
. Не нужно ждать начала второй следующей итерации.