Объясните, как в примере работает приведение типов

Svinina

Вот такой пример:
#include <stdio.h>
#include <pthread.h>
 
void * any_func (void * arg)
{
    int a = *(int *) arg;
    a++;
    return (void *) a;
}
 
int main (void)
{
    pthread_t thread;
    int parg = 2007, pdata;
    
    if (pthread_create (&thread, NULL,
            &any_func, &parg) != 0) {
        fprintf (stderr, "Error\n");
        return 1;
    }
 
    pthread_join (thread, (void *) &pdata);
    printf ("%d\n", pdata);
 
    return 0;
}
Не могу понять смысл строки return (void *) a; Как тип int приводится к типу void* ?
9 ответов

Svinina

a - это число. Адрес - это тоже число. Число a становится адресом типа void void * - это указатель. Функция возвращает указатель типа void, в котором хранится адрес, значением которого является a.


Svinina

void* - это безразмерный указатель. его можно привести впоследствии к любому типу


Svinina

Некорректный код. Функция возвращает ссылку на внутреннюю переменную. Предполагалось (int)(*arg)++ return arg;


Svinina

Да нет, вполне корректный. И работает верно. В принципе разобрался, как это работает, хотя по-моему разработчики POSIXа могли бы и менее педальные способы передачи данных между потоками разработать.


Svinina

Протупил. Оно не ссылку на локальную переменную возвращает, а увеличенное значение указателя.


Svinina

хотя по-моему разработчики POSIXа могли бы и менее педальные способы передачи данных между потоками разработать
какие, например? Если учесть, что передача параметров через void* является единственным способом реализации полиморфных функция в С


Svinina

какие, например? Если учесть, что передача параметров через void* является единственным способом реализации полиморфных функция в С
Не могу ответить на этот вопрос. Понимаю, что критиковать без предложения решения плохо, но все равно выглядит это как-то криво. Как в Qt реализовали сигналы? Как ввели собственные ключевые слова? Понятия не имею, но работать с ними вполне комфортно.


Svinina

Как в Qt реализовали сигналы? Как ввели собственные ключевые слова? Понятия не имею, но работать с ними вполне комфортно.
во-первых, какое отношение Qt имеет к языку С? во-вторых, библиотеке Qt написана не для C++, а для некоторого его "диалекта", переводом с которого на чистый С++ занимается т.н. метаобъектный компилятор.


Svinina

во-первых, какое отношение Qt имеет к языку С? во-вторых, библиотеке Qt написана не для C++, а для некоторого его "диалекта", переводом с которого на чистый С++ занимается т.н. метаобъектный компилятор.
К C Qt отношения не имеет, я просто продемонстрировал подход.