假设你有:
void *p = // something;
int size = 10;
*((char *)p + 8) = size ^ 1;
Run Code Online (Sandbox Code Playgroud)
我知道这看起来像是随机的逻辑,但我想知道它是否仍然按预期进行.当p被转换为char时,我试图将"size ^ 1"的整体放在"p + 8"指向的地址处.基本上我要问的是,它有什么不同:
*((int *)p + 2) = size ^ 1;
Run Code Online (Sandbox Code Playgroud)
此外,如果我选择将指针增加3,会发生什么,例如:
*((char *)p + 3) = size ^ 1;
Run Code Online (Sandbox Code Playgroud)
或(我知道这不等于所有其他人,但想看看这是否正确):
*((int *)p + 3) = size ^ 1;
Run Code Online (Sandbox Code Playgroud)
当您解除char *指针时,您指的是单个char对象.这样,它非常类似于:
char c;
c = size ^ 1;
Run Code Online (Sandbox Code Playgroud)
也就是说,结果值(在这种情况下为11)被转换为类型char,然后存储在该位置(char *)p + 8(char指向的第9个对象p).
所以是的,它与以下内容完全不同:
*((int *)p + 2) = size ^ 1;
Run Code Online (Sandbox Code Playgroud)
后一行修改整个int对象的大小sizeof(int),修改的对象是int指向的第三个对象p.
如果我们想象你有一个小端系统sizeof(int) == 4,那么你的四个例子将通过p以下方式修改指向的内存:
1.
*((char *)p + 8) = size ^ 1;
| ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | 11 | ?? | ?? | ?? | ?? | ?? | ?? | ?? |
Run Code Online (Sandbox Code Playgroud)
2.
*((int *)p + 2) = size ^ 1;
| ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | 11 | 00 | 00 | 00 | ?? | ?? | ?? | ?? |
Run Code Online (Sandbox Code Playgroud)
3.
*((char *)p + 3) = size ^ 1;
| ?? | ?? | ?? | 11 | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? |
Run Code Online (Sandbox Code Playgroud)
4.
*((int *)p + 3) = size ^ 1;
| ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | 11 | 00 | 00 | 00 |
Run Code Online (Sandbox Code Playgroud)