Проблема в вашем коде - использование casts . В C большую часть времени приведение указателя означает ошибочную конструкцию . Примечательно, что в этом примере никакие приведения не требуются, если конструкции используются правильно:
// no cast required because malloc returns void * and void * can be converted
// to a pointer to int without a cast
int *sum = malloc(sizeof (int));
// no cast required because int * can be converted to a void * without a cast
pthread_exit(sum);
void *sum1;
// no cast required because the address of void * is a void **!
pthread_join(tid1, &sum1);
Единственное место, где вам требуется приведение, это если вы сейчас конвертируете это void *
значение в int *
inline:
int value = *(int *)sum1;
но вы также можете преобразовать его по заданию, и опять же, приведение не требуется:
int *value_ptr = sum1;
printf("The value was %d\n", *value_ptr);
free(value_ptr);
Эмпирическое правило заключается в том, что приведение в порядке, если вы знаете что-то лучше, чем компилятор - например, "усечь это значение до uint8_t
" или "этот указатель void фактически указывает на int
, но я не назначаю это для того, чтобы сохранить нажатия клавиш "- но обычно не нормально просто замолчать предупреждение.
Некоторые программисты пишут такой код:
int *ptr;
pthread_join(tid1, (void **)&ptr);
Такой код не является строго соответствующим, так как int *
и void *
не являются совместимыми типами, могут иметь или не иметь одинаковое представление или даже размер, и, в частности, могут не совмещать друг друга.