Я думаю, что эта часть была бы корнем проблемы:
while ((dit = readdir(dip)) != NULL)
{
condition_var = dit->name;
a[i] = condition_var;
i++;
}
Я не уверен в том, как работает readdir (), но я бы предположил, что каждый раз он будет возвращать указатель временной структуры на dit,[i] сохраняет condition_var как указатель на имя.Вполне возможно, что позже будет сделан еще один вызов readdir (), который использует точно такое же пространство памяти для возврата временной структуры, перезаписывая пространство памяти, на которое указывал предыдущий condition_var.
Я бы предложил более безопасный способ.чтобы выполнить эту часть, которая может быть немного более сложной, однако.
while ((dit = readdir(dip)) != NULL)
{
int len = strlen(dit->name);
condition_var = malloc(len+1);
memncpy(condition_var, dit->name, len+1);
//condition_var = dit->name;
a[i] = condition_var;
i++;
}
Не забудьте освободить каждый блок памяти, который вы вывели, в конце программы.(Или вы можете просто оставить все это для ОС, чтобы собрать мем - не рекомендуется).Код должен быть таким:
int j; // use another loop indicator if you already declared j for other uses.
for(j = 0; j<i; j++) // i is the length of a[].
{
free(a[j]);
// no worry about a[j] being NULL. free() does nothing on a NULL pointer.
a[j] = NULL;
}