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。