首页 > 解决方案 > 为什么我的输出空白?

问题描述

为什么我的输出空白?指针可以修改但不能读取。为什么?

#include <iostream>
using namespace std;

int main(){
    int a = 0;
    char *x1,*x2,*x3,*x4;
    x1 = (char *)&a;
    x2 = x1;x2++;
    x3 = x2;x3++;
    x4 = x3;x4++;
    *x1=1;
    *x2=1;
    *x3=1;
    *x4=1;

    cout <<"@" << *x1 << " " << *x2 << " " << *x3 << " " << *x4 << "@"<<endl ;
    cout << a << endl;
}
[Desktop] g++ test_pointer.cpp
[Desktop] ./a.out
@   @
16843009

我想通过使用char类型的指针来读取整数的值。所以我可以逐字节读取。

标签: c++pointers

解决方案


你正在流式传输char。这些通过 IOStreams* 自动为您进行 ASCII 化,因此您看到(或者更确切地说,没有看到)不可打印的字符(实际上,所有 0x01 字节)。

您可以转换int为查看数值,或者添加std::hex常规视图。

例子:

#include <iostream>
#include <iomanip>

int main()
{
    int a = 0;

    // Alias the first four bytes of `a` using `char*`
    char* x1 = (char*)&a;
    char* x2 = x1 + 1;
    char* x3 = x1 + 2;
    char* x4 = x1 + 3;

    *x1 = 1;
    *x2 = 1;
    *x3 = 1;
    *x4 = 1;

    std::cout << std::hex << std::setfill('0');
    std::cout << '@' << std::setw(2) << "0x" << (int)*x1
              << ' ' << std::setw(2) << "0x" << (int)*x2
              << ' ' << std::setw(2) << "0x" << (int)*x3
              << ' ' << std::setw(2) << "0x" << (int)*x4
              << '@' << '\n';
    std::cout << "0x" << a << '\n';
}

// Output:
//   @0x01 0x01 0x01 0x01@
//   0x1010101

现场演示

那些说您的程序未定义的人是不正确的(假设您的程序int中至少有四个字节);别名对象 viachar*是特别允许的。

16843009输出正确;这等于0x01010101如果您将流置于十六进制模式,您将再次看到它。


注意有些人会推荐reinterpret_cast<char*>(&a)and static_cast<int>(*x1),而不是 C 风格的演员表,尽管我个人认为在这种特殊情况下它们丑陋且不必要。对于输出,您至少可以编写+*x1以获得“免费”提升int(通过一元运算+符),但这并不是非常自我记录。


* 从技术上讲,情况正好相反;IOStreams通常会自动将您的数字和布尔值等转换为正确的 ASCII 字符,以便在屏幕上正确显示。因为char它会跳过该步骤,假设您已经提供了所需的 ASCII 值。


推荐阅读