一种类型转换为另一种 C 的类型转换警告

Typecast warning of Conversion of one type to another C

我 运行 在 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) 尝试修复警告,它确实消除了警告,但导致了分段错误。我会 post 我的其余代码,但有很多代码,希望这足以让某人提供一些输入。

我知道我正在将一个 unsigned int 指针分配给一个 unsigned int,考虑到它的大小不同,但我不确定从这里去哪里。

如有任何帮助,我们将不胜感激。

谢谢。

您正试图将指针转换为整数。 C 允许这样做,但它并不经常做你想做的事,在这种情况下,目标类型没有起始类型那么宽,因此转换可能会导致有效数字丢失。这就是编译器警告您的内容。

如果函数参数 vp 是指向您想要的 unsigned int 值的指针,那么您正在寻找

unsigned int i = *(unsigned int *)vp;

也就是说,您将 pointer-to-void 转换为 pointer-to-unsigned int 正如您已经做的那样,然后 取消引用结果 以获得它指向的值到.

另一方面,如果您正在做一些愚蠢的事情,例如将想要的 unsigned int 值本身作为指针值传递,那么您可以简单地忽略该警告。在这种情况下,您的代码可能会按原样运行,警告是您为草率付出的代价。