предупреждение: приведение к указателю из целого числа разного размера [-Wint-to-pointer-cast] - PullRequest
3 голосов
/ 12 февраля 2012

часть моего кода:

int server_sockfd, client_sockfd; //socket file descriptors of client and server

// ... some code 

if(pthread_create(&vlakno, NULL, handle_client, (int *) client_sockfd) != 0) {
            perror("Error while creating thread.");
        }

Я получаю "предупреждение: приведение к указателю из целого числа другого размера [-Wint-to-pointer-cast]"

прототип моей функции:

void *handle_client(void *args);

Я нашел этот вопрос:
ссылка

В первом ответе говорилось что-то вроде этого, он должен использовать intptr_t вместо int.
У меня два вопроса:
В чем разница между int и intptr_t в моем случае?
Что мне делать?

У меня есть 2 идеи:
1-е: (изменение типа файловых дескрипторов)

 int server_sockfd, client_sockfd; //socket file descriptors of client and server

    // ... some code 

    if(pthread_create(&vlakno, NULL, handle_client, (intptr_t *) client_sockfd) != 0) {
                perror("Error while creating thread.");
            }

или 2-я идея: (изменение типа только в функции приведения pthread_create)

intptr_t server_sockfd, client_sockfd; //socket file descriptors of client and server

        // ... some code 

        if(pthread_create(&vlakno, NULL, handle_client, (int *) client_sockfd) != 0) {
                    perror("Error while creating thread.");
                }

EDIT:
в функции handle_client я хочу сделать это:

int clientSocket;
clientSocket = (int)args;

Мне очень жаль пользователя cnicar или что-то в этом роде ... он, к сожалению, удалил свой ответ, но он был в порядке.
Его решение было использовать (void *), сначала он вызывал ту же ошибку, но это было вызвано, вероятно, плохим поведением затмения :( Итак, сообщение для него:
Хорошо, спасибо, теперь все в порядке ... Eclipse по-прежнему выдает это предупреждение, но когда я дважды его включаю и выключаю, отредактирую его с помощью редактирования :) спасибо большое

Ответы [ 3 ]

6 голосов
/ 12 февраля 2012

Вы объявили client_sockfd как int.Вы не должны приводить это к int * таким образом.

Используйте оператор &, чтобы получить адрес client_sockfd вместо этого, если вы намеревались дать указатель на client_sockfd:

pthread_create(&vlakno, NULL, handle_client, &client_sockfd)
                                          // ^ & operator

Не упустите время жизни client_sockfd, оно должно пережить поток, чтобы предотвратить условия гонки (см. комментарии).


Разница между int и intptr_t заключается в том, что int предназначен для хранения целого числа, а intptr_t предназначен для хранения адреса в виде целого числа.intptr_t гарантированно сможет удерживать указатель, а int - нет.

Если вы намеревались передать значение из client_sockfd, приведите его к intptr_t:

pthread_create(&vlakno, NULL, handle_client, (intptr_t)client_sockfd)
2 голосов
/ 12 февраля 2012
(int *) client_sockfd

client_sockfd не является указателем. Это int, который отличается от размера int *. И это говорит тебе об этом.

Последний аргумент pthread_create() является void * и предназначен для указания указателя на данные, которые вы хотите передать в этот конкретный поток. Похоже, вы пытаетесь преобразовать целочисленное значение client_sockfd в указатель и передать его. Как правило, это не то, что вы делаете, но если вы действительно хотите и избегаете предупреждения, вам нужно использовать что-то такого же размера, что и указатель, что дает вам intptr_t. Скорее всего, int - это 4 байта, а intptr_tvoid *) - это восемь байт в вашей системе, но это зависит от платформы. В то время как вы можете безопасно перейти от 32-> 64-> 32-битных, компилятор предупреждает вас, что у вас есть разные размеры.

0 голосов
/ 12 февраля 2012

(int *) client_sockfd не эквивалентно &client_sockfd.

Первая преобразует значение client_sockfd в int *, а вторая форма возвращает указатель на client_sockfd.

Это последнее выражение, которое вы должны использовать для pthread_create последнего аргумента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...