簡體   English   中英

為什么我的輸出空白?

[英]why i am getting output blank?

為什么我的輸出空白? 指針可以修改但無法讀取。為什么?

#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的指針類型來讀取integer的值。 這樣我就可以逐字節讀取。

您正在流char IOStreams *會自動為您提供ASCII碼的這些字符,因此您看到(或更確切地說,沒有看到) 不可打印的字符 (實際上是所有0x01字節)。

您可以將其int轉換為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至少包含四個字節); 特別允許通過char*對象起別名。

16843009輸出正確; 等於0x01010101 ,如果將流設置為十六進制模式,則會再次看到該值。


注意:有些人會建議使用reinterpret_cast<char*>(&a)static_cast<int>(*x1) ,而不是C樣式的強制類型轉換,盡管在我個人看來,在這種特殊情況下它們很丑陋且不必要。 對於輸出,您至少可以編寫+*x1來獲得對int的“免費”升級(通過一元+運算符),但這並不是非常自我記錄。


*從技術上講,情況與此相反; IOStreams 通常會自動將您的數字,布爾值和其他內容轉換為正確的ASCII字符,以在屏幕上正確顯示。 對於char ,假設您已經提供了所需的ASCII值,它將跳過該步驟。

假設int在您的系統上至少有4個字節長,則程序將操縱int a的4個字節。

結果16843009是十進制值0x01010101 ,所以這是您所期望的。

您不會在輸出的第一行看到任何內容,因為您寫入了4個二進制值1 (或0x01 )的字符,它們是不可見的字符(ASCII SOH)。

當您像這樣修改程序時

*x1='1';
*x2='3';
*x3='5';
*x4='7';

您將看到帶有預期字符的輸出

@1 3 5 7@
926233393

926233393是的十進制表示0x37353331其中0x37是字符的ASCII值'7'

(這些結果對於小端架構是有效的。)

看看你對x的聲明

char *x1,*x2,*x3,*x4;

這些是指向chars (字符)的指針。

在流輸出中,它們被解釋為可打印字符。 仔細查看ascii-Table,您會發現較低的數字不可打印。

由於您的int a為零,因此指向各個字節的x也為零。

獲得可讀輸出的一種可能性是將字符轉換為int ,以便流將打印數字表示形式而不是ascii字符:

cout <<"@" << int(*x1) << " " << int(*x2) << " " << int(*x3) << " " << int(*x4) << "@"<<endl ;

如果我正確理解了您的問題,這就是解決方案

#include <stdio.h>
#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 <<"@" << (int)*x1 << " " << (int)*x2 << " " << (int)*x3 << " " << (int)*x4 << "@"<<endl ;
    cout << a << endl;
}

您可以使用一元+將字符類型(打印為符號)轉換為整數類型(打印為數字):

cout <<"@" << +*x1 << " " << +*x2 << " " << +*x3 << " " << +*x4 << "@"<<endl ;

查看積分促銷

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM