c++ - 为什么我的输出空白?
问题描述
为什么我的输出空白?指针可以修改但不能读取。为什么?
#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类型的指针来读取整数的值。所以我可以逐字节读取。
解决方案
你正在流式传输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 值。
推荐阅读
- wordpress - 重力形式 将输入的数据从第 1 页传递到第 2 页
- reactjs - Azure Graph API 给出错误“身份验证令牌不包含有效权限或用户没有有效角色”
- azure - “www-authenticate →Bearer”带有未经授权的 401
- firebase - -Firebase- 不懂规则
- scala - ElasticSearch:使用代码中的查询更改字段值
- android - 将vectorDrawables与androidx一起使用的更新
- gmail-api - 拦截 gmails/outlook 传入电子邮件以进行进一步检查
- angular - 点击事件 - 我有 3 个手风琴,我想知道如何只使用一种方法一次管理一个事件
- python-3.x - 如何使用 REST 的 put 函数替代 post 函数来保存多个数据?
- javascript - 从Angular JS中的不同应用程序加载模板