Попробуйте развернуть петли. Два случая станут следующими:
первый случай:
pthread_create(&threads[0], NULL, f, &i);
pthread_create(&threads[1], NULL, f, &i);
…
pthread_create(&threads[9], NULL, f, &i);
второй случай:
pthread_create(&threads[0], NULL, f, &t[0]);
pthread_create(&threads[0], NULL, f, &t[1]);
…
pthread_create(&threads[9], NULL, f, &t[9]);
Если вы заметили, в первом случае вы всегда передаете &i
каждому потоку, поэтому каждый поток будет указывать на один и тот же i
и его последнее содержимое.