打印结构矢量时的奇怪行为

时间:2011-12-06 21:11:43

标签: c++ printf

我想将结构向量的值打印到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);
}

在第二个代码列表中,filenumber和return_address总是0,而filename给了我一些神秘的字符。

任何人都知道可能导致此问题的原因是什么?

2 个答案:

答案 0 :(得分:3)

很可能第一个只有出现才能工作。我怀疑发生的事情是你的%x打印地址实际上是通过一个64位指针(你编译的是64位二进制文​​件吗?)。然后,当你在单独的调用中执行它时,它看起来很好,并从地址打印32位。当你一起运行它时printf会因为你撒谎了每个成员使用的空间而感到困惑。

如果你试图这样做,那么g ++会在-Wall发出警告。

解决这个问题的C ++方法是使用iostreams。类型安全且容易。

如果您希望使用printf的C方式,则可能需要使用%lx,并确保将指针转换为long,以便类型始终排列。< / p>

答案 1 :(得分:1)

如果没有看到CS结构的定义,并且不知道您的C ++编译器和ABI设置,那么肯定很难说。

但最有可能的解释是你有一个尺寸问题。例如,我怀疑itr->base_address是一个64位变量,但%08x期望一个32位变量。您可能需要使用%08lx代替。