打印

2010-06-14 32 views
4

我有一個struct這樣打印

typedef struct _somestruct { 
    int a; 
    int b; 
}SOMESTRUCT,*LPSOMESTRUCT; 

我創建的對象爲struct,並試圖將其打印出來的地址,這樣

int main() 
{ 
    LPSOMESTRUCT val = (LPSOMESTRUCT)malloc(sizeof(SOMESTRUCT)); 

    printf("0%x\n", val); 

    return 0; 
} 

..和我一個結構對象的地址得到這個警告

warning C4313: 'printf' : '%x' in format string conflicts with argument 1 of type 'LPSOMESTRUCT'

所以,我試圖把地址投給int這樣

printf("0%x\n", static_cast<int>(val)); 

但我得到這個錯誤:

error C2440: 'static_cast' : cannot convert from 'LPSOMESTRUCT' to 'int'

缺少什麼我在這裏?如何避免此警告?

謝謝。

回答

11

%x預計未簽名。你打印的是一個指針。要正確執行此操作,通常需要使用%p。要迂腐正確,需要一個指向無效,所以你需要將其強制轉換:

printf("%p\n", (void *)val); 

在現實中,目前大多數的實現使用同一格式的所有指針,在這種情況下,中投將是空洞。當然,考慮到C++標籤,你所包含的大部分代碼最多都會有問題(除了像LPSOMESTRUCT這樣的部分,無論哪個都是有問題的)。在C++中,通常要更多的東西一樣:

struct somestruct { 
    int a; 
    int b; 
}; 

somestruct *val = new somestruct; // even this is questionable. 

std::cout << val; 
1

如果你想投射然後使用reinterpret_cast而不是static_cast可能會在這裏做的伎倆。

使用printf嘗試使用%zu而不是%x來打印指針,因爲指針是無符號整數類型(即%zu)。

printf("%zu \n", val); 

只是另一件事,作爲一個c + +程序是有一個原因,你爲什麼使用malloc而不是新的?

2

使用%p格式說明符來打印指針。

printf("%p\n", val); 
1

由於這是標記C++,我可以指出,在語言創建結構,當你不需要的typedef:

typedef struct _somestruct { 
    int a; 
    int b; 
}SOMESTRUCT,*LPSOMESTRUCT; 

應:

struct SOMESTRUCT { 
    int a; 
    int b; 
}; 

而且,它被許多人認爲是不好的做法,以創建像LPSOMESTRUCT的typedef其中隱藏的事實是一個類型的指針。