C 什么是;赋值从整数生成指针,不带强制转换;什么意思?

C 什么是;赋值从整数生成指针,不带强制转换;什么意思?,c,pointers,C,Pointers,早些时候,我问了一个类似的问题,但后来我修改了代码。现在编译器给了我一个不同的警告。这是我的代码现在的样子的一个示例: void *a = NULL; void *b = //something; a = *(int *)((char *)b + 4); 当我尝试编译时,我得到“警告:赋值从整数生成指针而不进行强制转换”。这意味着什么,我应该做些什么来修复它 为了澄清,我不希望“a”指向比“b”大4字节的地址(即,a!=b+4)。在我的程序中,我知道((char*)b+4)处存储的值本身就是另

早些时候,我问了一个类似的问题,但后来我修改了代码。现在编译器给了我一个不同的警告。这是我的代码现在的样子的一个示例:

void *a = NULL;
void *b = //something;
a = *(int *)((char *)b + 4);
当我尝试编译时,我得到“警告:赋值从整数生成指针而不进行强制转换”。这意味着什么,我应该做些什么来修复它

为了澄清,我不希望“a”指向比“b”大4字节的地址(即,a!=b+4)。在我的程序中,我知道((char*)b+4)处存储的值本身就是另一个指针,我想将该指针存储在“a”中。

因为,“存储在
((char*)b+4)
处的值本身就是另一个指针”,只需向结果添加显式转换:

void *a = NULL;
void *b = //something;
a = (void*)*(int *)((char *)b + 4);
由于您假定
sizeof(void*)==sizeof(int)
,代码是不可移植的,但我相信您已经知道了这一点


一种可移植的替代方法是使用
intptr\t
而不是
int
,因此在
b+4
中存储了一个指针值,您希望将其加载到
A
?然后将其视为一个,因此(b+4)指向一个指针-指向int的指针是
int**

  *(int**)((char*)b+4) 

不过,这(以及整个问题)是未定义的行为。@KerrekSB:毫无疑问。@KerrekSB:你是什么意思?问题的哪一部分导致了未定义的行为?@David:将随机指针视为
int*
,并取消对它的引用,即答案第三行的第二个星号。只有通过从现有的
int*
中减去4个字节来获得
b
时,这才可以,但通常是UB。