假设你有:
void *p = // something;
int size = 10;
*((char *)p + 8) = size ^ 1;
我知道这看起来像是随机的逻辑,但我想知道它是否仍然会按预期进行。当p被转换为char时,我试图将“size ^ 1”的整体放在“p + 8”指向的地址处。基本上我要问的是,它与以下内容有什么不同:
*((int *)p + 2) = size ^ 1;
此外,如果我选择将指针增加3,会发生什么,例如:
*((char *)p + 3) = size ^ 1;
或(我知道这不等同于所有其他人,但想知道这是否正确):
*((int *)p + 3) = size ^ 1;
答案 0 :(得分:5)
当您解除char *
指针时,您指的是单个char
对象。这样,它非常类似于:
char c;
c = size ^ 1;
即,结果值(在本例中为11)转换为类型char
,然后存储在(char *)p + 8
位置(char
对象指向的p
对象1}})。
所以是的,它与以下内容完全不同:
*((int *)p + 2) = size ^ 1;
后一行修改整个int
对象,大小为sizeof(int)
,修改的对象是int
指向的第三个p
对象。
如果我们想象您有一个带有sizeof(int) == 4
的小端系统,那么您的四个示例将通过以下方式修改p
指向的内存:
1
*((char *)p + 8) = size ^ 1;
| ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | 11 | ?? | ?? | ?? | ?? | ?? | ?? | ?? |
2
*((int *)p + 2) = size ^ 1;
| ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | 11 | 00 | 00 | 00 | ?? | ?? | ?? | ?? |
3
*((char *)p + 3) = size ^ 1;
| ?? | ?? | ?? | 11 | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? |
4
*((int *)p + 3) = size ^ 1;
| ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | 11 | 00 | 00 | 00 |
答案 1 :(得分:1)
*((char *)p + 8) = size ^ 1
隐式地将size ^ 1
强制转换为char
,除了最低位字节之外,它们除外;所以不,它与*((int *)p + 2) = size ^ 1
不一样。
答案 2 :(得分:0)
*((char *)p + 8) = size ^ 1;
与:
char something;
something = size ^ 1;
你可以从那里弄清楚,但更好的只是尝试并找出答案!