2012-03-04 237 views
1

對於學校prject我們有一個指針工作,爲了這個,我想看看內存不會忽略,但... 當我用下一段代碼:怪異控制檯輸出

int _tmain(int argc, _TCHAR* argv[]){ 
    char a; 
    char b; 
    char * pa; 
    char * pb; 
    pa = &a; 
    pb = &b; 

    cout << "adress pa "<< pa <<endl; 
    cout << "adress pb "<< pb <<endl; 

    cout << "a is " << a << endl; 
    cout << "b is " << b << endl; 

我得到這個作爲輸出: enter image description here

這是一個字符集問題,最重要的是我可以糾正這個?

我已經測試另一段代碼:

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

int _tmain(int argc, _TCHAR* argv[]) 
{int x = 25; 
int * p; 
p = &x; 
cout << "adres" << p << endl; 
*p = 10; 
cout << "x"<< x << endl; 
cin.get(); 

    return 0; 
} 

並且輸出是可讀: enter image description here

什麼不同?

回答

6

這是因爲您正在取消引用未初始化的指針。這是未定義的行爲。

一個<<操作者的在C++標準庫重載的解釋char*爲C字符串,而不是作爲一個指針。正弦C字符串未初始化,<<運算符打印垃圾。對於int*,沒有類似的超載會將其解釋爲指針之外的任何內容,因此您會在第二種情況下看到正確的行爲。

如果您不希望將char*指針解釋爲C字符串,請將指針指向void*

cout << hex << static_cast<void*>(pa) << endl; 

hex可讓您使用更傳統的基本-16表示法顯示指針)。

+0

是的,ik可以看到差異謝謝你很多 – Plumbum7 2012-03-04 14:01:10

+0

SORRY SORRY(我設置了錯誤的正確答案按鈕)。 – Plumbum7 2012-03-04 14:21:22