This ...
int exitcode;
[...]
pthread_join(handle, (void **)&exitcode);
... производит неопределенное поведение, потому что ссылка &exitcode
являетсяint
, но pthread_join
приведет к тому, что значение будет записано в него, как если бы оно было void *
.
. Этого вполне достаточно, чтобы поведение было неопределенным, независимо от других соображений.,Однако, размышляя о , почему C может объявлять такие ситуации как UB, учтите, что довольно часто размер void *
больше, чем размер int
, так чтодолжно произойти, когда программа пытается записать данные в пространство, слишком маленькое для этого?
Самое странное: если вы раскомментируете i ++, все возвращается к нормальной жизни
Такие аномалии являются явным признаком того, что ваша программа демонстрирует UB.Стандарт C прямо отрицает наличие какого-либо объяснения этому - это часть того, что означает «неопределенное поведение».
В любом случае, похоже, что вы этого хотите, вместо этого:
void *exit_ptr;
pthread_join(handle, &exit_ptr);
exitcode = (int) exit_ptr;
Будьте готовы к тому, что компилятор выдаст вполне обоснованное предупреждение о приведении указателя к int, хотя вы должны иметь возможность заставить его замолчать, приведя вместо него intptr_t
.