将C ++中的内存地址中的值打印为十六进制

时间:2019-02-10 21:15:43

标签: c++ hex

我正在尝试制作一个程序,该程序接受一个整数值,然后以十六进制打印出每个四个字节的值。因此对于255,它应该打印出FF 00 0000。这就是到目前为止我的代码。

#include "pch.h"
#include <iostream>
#include <iomanip>
using namespace std;


int main()
{
    int num;
    cout << "Enter an integer" << endl;
    cin >> num;

    int* p = &num;
    unsigned char* q = (unsigned char*)p;

    for (int i = 0; i < 4; i++) {
        cout<< hex <<*(int*)(q+i) << " ";
    }

}

当我输入255时,它将打印ff cc000000 cccc0000 cccccc00,c是什么?

2 个答案:

答案 0 :(得分:2)

cout语句中,您将(q+i)自身强制转换为int*指针,然后对其进行解引用以获取int值。这是错误的,因为(q+i)并不指向int,并且在num时取消对它的引用将超出i > 0的边界到周围的内存中。

您需要按原样取消对(q+i)的引用,以获取它实际指向的unsigned char,然后将THAT值转换为[unsigned] int(或至少打印到[[unsigned] short):

cout << hex << static_cast<int>(*(q+i)) << " ";

此外,int在所有系统上都不总是4个字节,因此您不应该对大小进行硬编码,而应使用sizeof(int)

for (int i = 0; i < sizeof(num); i++)

Live Demo

答案 1 :(得分:2)

CC是未初始化的堆栈存储器标签,由Visual C++ in debug mode设置。

请注意,您在(int*)(q+i)上也存在严格的别名冲突。

可能想要的是这样的:

#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
    int num;
    cout << "Enter an integer" << endl;
    cin >> num;

    unsigned char* q = (unsigned char*)&num;

    for (int i = 0; i < 4; i++) {
        cout << hex << (int)q[i] << " ";
    }

}