[英]Printing the address of a struct object
我有這樣的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;
}
..我得到了這個警告
警告C4313:'printf':格式字符串中的'%x'與'LPSOMESTRUCT'類型的參數1沖突
所以,我試着像這樣把地址轉換為int
printf("0%x\n", static_cast<int>(val));
但我得到這個錯誤:
錯誤C2440:'static_cast':無法從'LPSOMESTRUCT'轉換為'int'
我在這里錯過了什么? 如何避免這種警告?
謝謝。
%x
期望無符號。 你打印的是一個指針。 要正確執行此操作,通常需要使用%p
。 為了迂腐正確,這需要一個指向void的指針,所以你需要將它轉換為:
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;
使用%p格式說明符打印指針。
printf("%p\n", val);
如果你想使用reinterpret_cast而不是static_cast進行強制轉換,可以在這里訣竅。
使用printf嘗試使用%zu而不是%x來打印指針,因為指針是無符號整數類型(即%zu)。
printf("%zu \n", val);
另外一件事,作為一個c ++程序,你有沒有理由使用malloc而不是new?
由於這是標記的C ++,我可以指出在使用該語言創建結構時不需要typedef:
typedef struct _somestruct {
int a;
int b;
}SOMESTRUCT,*LPSOMESTRUCT;
應該:
struct SOMESTRUCT {
int a;
int b;
};
此外,許多人認為創建像LPSOMESTRUCT這樣的typedef是一種不好的做法,它隱藏了一個類型是指針的事實。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.