“从不同大小的整数转换为指针”是什么意思?

时间:2011-10-17 06:37:05

标签: c pointers

这是我的代码的示例:

void *a = NULL;
void *b = //something;
a = (void *)(*((char *)b + 4));

(b + 4)指向的值是我要存储在a中的地址。当我尝试编译时,我得到“警告:从不同大小的整数转换为指针。”这是什么意思,我该怎么做才能解决它?

编辑:为了澄清,我不希望'a'指向比'b'大4个字节的地址。在我的程序中,我知道存储在((char *)b + 4)的值本身就是另一个指针,我想将这个指针存储在'a'中。

4 个答案:

答案 0 :(得分:2)

这是char*

(char *)b + 4

这意味着:

*((char *)b + 4)

char。然后继续将char转换为void*,编译器会抱怨。您不必手动转换为C中的void*,所以这应该是:

a = (char *)b + 4;

评论更新:听起来就像你之后:

a = *(char **)((char *)b + 4)

答案 1 :(得分:0)

听起来是什么:你的指针出了点问题。

在这种情况下,重新检查一下你的表达式:你真的是char地址吗?

(void *)(*((char *)b + 4));

所以

(char *)b

是指向char的指针,按

(char *)b+4

然后*((char *)b+4)解除引用(char *)b+4,因此类型为char - 然后您尝试将该内容(可能是1个字节)转换为4或8字节地址。因此,尺寸不匹配。

答案 2 :(得分:0)

如果你把这些陈述分开来,它会提高可读性 我为你做了这件事并得到:

char *c = (char *)b;
char *d = c + 4;
a = (void *)
        (*d); // <- this is c char and you want to cast it to a pointer

好像你写了太多的星号

答案 3 :(得分:0)

void *a = NULL;
char jig[10]="jigarkumar";
void *b = jig;
printf("b is %p",b);
a = (void *)(((char *)b + 4));
printf("\na is %p",a);

问题在这里

a = (void *)(*((char *)b + 4));
             ^
             |

这个*获取存储在b + 4地址&amp;它被分配给一个错误的    所以只需删除那个&amp;你的代码可以正常工作