簡體   English   中英

打印結構對象的地址

[英]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.

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