Вы вызываете неопределенное поведение:
void idle()
{
...
}
В соответствии с руководством для g_idle_add подпись функции должна быть gboolean (*GSourceFunc) (gpointer user_data);
, а функция должна возвращать логическое значение.
Если функция возвращает FALSE, она автоматически удаляется из списка источников событий и больше не будет вызываться.
Не возвращает значение, пока вызывающая сторона ожидает его и использует возвращаемое значение, неопределенное поведение.
Если вы просто вернетесь из функции, у вас может быть около 0 байт в ячейке, которая используется для возвращаемых значений, которая рассматривается как FALSE
. После вызова printf
вы, вероятно, получите возвращаемое значение из printf
в этом месте, и когда вы печатаете 1 символ, это значение равно 1, что не FALSE
, и функция вызывается снова.
У вас также есть неправильный состав:
g_idle_add((void*)&idle,NULL);
Тип void*
совместим со всеми указателями данных. Вы злоупотребляете этим, чтобы вызвать неправильный тип функции в вызове.
Вместо этого используйте правильную функцию и удалите актерский состав. Если вам требуется приведение типа функции, скорее всего что-то не так в использовании этой функции.