我在gcc编译器中遇到警告,如下所示:
thread_primes.c(295): warning #810: conversion from "unsigned int *" to "unsigned int" may lose significant bits
unsigned int i = (unsigned int*) vp;
^
它正在发生的功能是:
void *elim_composites(void *vp)
{
//*((unsigned int*) vp)
unsigned int i = (unsigned int*) vp;
unsigned int min = i * (max_prime / num_threads) + 1;
/* If we're on the last thread, set the max equal to the max_prime */
unsigned int max =
(i ==
num_threads - 1) ? max_prime : min +
(max_prime / num_threads) - 1;
unsigned int j;
unsigned long k; //This is much faster as long as opposed to unsigned int
j = 1;
while ((j = next_seed(j)) != 0)
{
for (k = (min / j < 3) ? 3 : (min / j); (j * k) <= max;
k++)
{
set_not_prime(j * k);
}
}
pthread_exit(EXIT_SUCCESS);
}
我已经尝试((unsigned int*) vp)
尝试修复警告,它确实摆脱了警告但导致了分段错误。我会发布我的其余代码,但有很多代码,希望这足以让某些人提供一些意见。
我知道我正在为unsigned int分配一个unsigned int指针,考虑到它的大小不一样,但我不知道从这里去哪里。
任何帮助都将不胜感激。
谢谢。
答案 0 :(得分:2)
您正在尝试将指针强制转换为整数。 C允许这样做,但它通常不会做你想要的,在这种情况下,目标类型不像起始类型那么宽,因此转换可能会导致有效数字的丢失。这就是编译器警告你的内容。
如果函数参数vp
是指向你想要的unsigned int值的指针,那么你正在寻找
unsigned int i = *(unsigned int *)vp;
也就是说,你将指针指向void转换为指针指向 - unsigned int
正如你已经做的那样,然后取消引用结果以获得它指向的值。
另一方面,如果你正在做一些愚蠢的事情,比如传递想要的unsigned int
值本身就好像它是一个指针值,那么你可以简单地忽略警告。在这种情况下,您的代码可能会按原样运行,警告是您为草率而付出的代价。