将char*转换为int* C++

3

我有一段代码,是在某个地方看到的,我试图弄清楚它是如何工作的,但我无法理解。

这就是代码:

#include <iostream>
using namespace std;

int main() {
   int a = 2;
   char * p = (char *) &a;
   *(p + 1) = 1;
   cout << (int *) p << endl;
   return 0;
}

我认为在p中存储了变量a的二进制值,如00000010。 接着,在下一个地址中存储了00000001。 当我尝试打印(int *) p时,它会从该地址取4个字节并将其转换为整数。
当我运行程序时,结果并非预期。它只显示了变量a的地址,没有观察到任何变化。
请问你能解释一下这是如何工作的以及为什么吗?
附注:如果我想显示p的值,它只显示2而不是我预期的258。

2
这个 *(p + 1) = 1; 是未定义行为。 - 101010
1
这是一种依赖于系统的黑客方式,强制将位8-15设置为00000001。代码所有者想以这种方式做的特别原因是什么?这不像a = (a & ~0xFF00) | 0x0100很慢吗? - Andy Brown
1
@unwind,它表示 "sizeof(char) <= sizeof(short) <= sizeof(int)"。 - 101010
@unwind:你的意见是否改变,认为它是ub了吗? - Giorgi Moniava
1
@Giorgi 是的,我曾经错误地认为 sizeof (int) > sizeof (char) 是正确的,但实际上应该是 >=,这使得访问 int 的第二个 char 的代码可能会导致未定义行为。 - unwind
显示剩余10条评论
2个回答

3

cout << (int *) p << endl;cout << &a << endl;相同(即输出指针变量a的地址)。

int a = 2;
cout << sizeof(a) << endl;       // 4 (int is 4 bytes)
cout << sizeof(&a) << endl;      // 8 (64b machine, so pointer is 8 bytes)

char *p = (char *) &a;           // p points to first byte of a (normally 4 bytes)
cout << (int) *p << endl;        // 2    // Little Endian, the first byte is actually the last
cout << (int) *(p + 1) << endl;  // 0

*(p + 1) = 1;                    // second byte of a is now set to 1
cout << a << endl;               // a now changes to 258 (0000 0001 0000 0010)

2
PS:如果我想显示p的值,它只会显示2而不是我期望的258。
变量p的值是指向对象的地址。您的困惑似乎出现在这里。如果您对p进行解引用,您将得到指向该对象的值,两者是有区别的。
因此,在您的情况下,变量p被初始化为a的地址。之后,没有给它赋任何值(例如,您没有执行p=&SomeOtherObject)。
   cout << (int *) p << endl; // Print value of pointer -which is address

所以您打印的是p的值,即a的地址。

请注意:

*(p+1) = 1

如果sizeof (int)sizeof (char)相同,则可能是未定义的行为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接