Поскольку оба ваших вопроса связаны, я отвечу на них вместе: pthread_create
принимает параметр void *
, так что вы действительно можете передать любой указатель, какой захотите. В этом случае, однако, мы на самом деле не передаем указатель, а просто целое значение, приведенное в качестве указателя. Это означает, что вы получите к нему доступ таким образом: caracter
:
int value = (int)n_veg;
Как вы упомянули, вы вполне могли бы передать фактический указатель как &n_veg
и получить значение следующим образом:
int value = *(int *)n_veg;
На самом деле, в большинстве случаев вам нужно будет передать больше данных, чем просто целое число, например структуру, и в этом случае вы должны передать указатель, так как вы не можете просто приведите его к указателю как целое число.
При передаче указателя следует помнить, что n_veg
не должен выходить из области действия, пока поток работает. Например, если вы делаете:
void test() {
int n_veg;
pthread_create(&tid[n],NULL,caracter,&n_veg);
}
затем &n_veg
будет недействительным, как только вернется test
, но поток все еще может быть запущен и будет содержать неверный адрес. Из-за этого структуры, передаваемые потокам, обычно распределяются динамически, например, с использованием malloc
, и поток может free
завершить его.