簡體   English   中英

打印結構向量的奇怪行為

[英]Strange behavior with printing a vector of structs

我想將結構向量的值打印到stdout。

該結構定義如下:

typedef struct CallStackEntry {
    DWORD64 base_address;
    DWORD64 return_address;
    char* file_name;
    char* symbol_name;
    DWORD line_number;

    CallStackEntry(DWORD64 ba, DWORD64 ra, char* f_name, char* s_name, DWORD ln) : 
                        base_address(ba), return_address(ra), file_name(new char[strlen(f_name)+1]), symbol_name(new char[strlen(s_name)+1]), line_number(ln)  
    {
        memcpy(file_name,f_name, strlen(f_name)+1);
        memcpy(symbol_name,s_name,strlen(s_name)+1);
    }

    } CS;

以下代碼可用於打印:

void debuglib::StdOutLogger::logg(std::vector<CS> ces) {
    std::vector<CS>::iterator itr;
    for ( itr = ces.begin(); itr < ces.end(); ++itr )
    {       
        //printf("%08x", itr->return_address);
        printf("%s() called\nBaseaddress: 0x%08x\n", itr->symbol_name, itr->base_address);
        printf("Returnaddress: 0x08%x\n", itr->return_address);
        printf("In File: %s (Line: %d)\n\n", itr->file_name, itr->line_number);
    }
}

但是,此代碼不起作用:

for ( itr = ces.begin(); itr < ces.end(); ++itr ) { 
    printf("%s() called\nBaseaddress: 0x%08x\nReturnaddress: 0x%08x\nInFile:%s (Line: %d)\n\n", itr->symbol_name, itr->base_address, itr->return_address, itr->file_name, itr->line_number);
}

在第二個代碼列表中,文件號和return_address始終為0,文件名給了我一些神秘的字符。

任何人都知道什么可能導致此問題?

很有可能第一個似乎沒有。 我懷疑正在發生的事情是您的%x打印地址實際上正在傳遞64位指針(您正在編譯64位二進制文​​件嗎?)。 然后,當您在單獨的調用中執行此操作時,它看起來很好,並從地址中打印出32位。 當您一起運行它們時, printf會感到困惑,因為您撒謊了每個成員使用的空間量。

如果您嘗試這樣做,g ++將在-Wall警告。

解決此問題的C ++方法是使用iostream。 類型安全且容易。

如果要用printf的C方式,則可能要改用%lx ,並確保將指針強制轉換為long類型,以便類型始終對齊。

如果沒有看到CS結構的定義,也沒有了解C ++編譯器和ABI設置,就很難確定。

但最可能的解釋是您遇到尺寸問題。 例如,我懷疑itr->base_address是64位變量,但是%08x期望使用32位變量。 您可能需要改用%08lx

暫無
暫無

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

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