Действительно ли законно передать аргумент как пусто*?

Я только что начал изучать pthreads API, и я следую учебному руководству здесь

Однако в примере программы pthread_create, пример программы создает длинную переменную и передает ее значение, преобразованное тип как void*. В функции записи потока это разыменовывает его точно так же, как длинное.

Действительно ли это законно? Я понимаю, передаю ли я адрес переменной t, каждый поток действовал бы на ту же переменную а не на копию его. Мы можем сделать это, потому что это - a void* и компилятор понятия не имеет, о каком типе мы отправляем?

#include 
#include 

#define NUM_THREADS     5

void *PrintHello(void *threadid)
{
   long tid;
   tid = (long)threadid;
   printf("Hello World! It's me, thread #%ld!\n", tid);
   pthread_exit(NULL);
}

int main (int argc, char *argv[])
{
   pthread_t threads[NUM_THREADS];
   int rc;
   long t;
   for(t=0; t

6
задан Abel 4 June 2010 в 09:30
поделиться

2 ответа

Это работает, пока sizeof (long) <= sizeof (void *) , и что каждое значение long может быть представлено как недействителен * .

Лучше было бы передать адрес переменной. Вы можете преобразовать из T * в void * и обратно безопасно и без предположений.

4
ответ дан 16 December 2019 в 21:35
поделиться

Это так же законно, как и любой вид приведения типов. Дело в том, что со значением, на которое указывает аргумент, ничего нельзя сделать, пока оно не будет приведено к типу, поэтому tid = (long) threadid .

Проверьте старые вопросы и ответы Когда использовать недействительный указатель? .

4
ответ дан 16 December 2019 в 21:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: