【问题标题】:Get the values at memory addresses获取内存地址的值
【发布时间】:2014-11-10 13:52:53
【问题描述】:

我正在使用 C++ 进行文件操作项目。我正在尝试在我的程序中打印当前进程的内存和 cpu 使用情况。我从here 获得了一些参考帮助 但它打印进程使用的内存地址。我想要的只是获取该地址的内存使用值。我尝试通过指针使用但没有成功。

通过这样做,它会打印进程的内存地址。

 printf( "\tPeakPagefileUsage: 0x%08X\n", 
                  pmc.PageFaultCount );

没关系, 但后来我尝试打印该地址的值。它给出了例外

unsigned int *jk;
*jk=pmc.PageFaultCount;
        cout<<"\n"<<jk<<"\n";

可能是我使用了错误的数据类型来保存 jk 中的内存地址。 但我不确定,问题是什么。 PLz指导我解决这个问题

【问题讨论】:

  • 你的仪式,在 c++ 中我们也做同样的事情 int m=9;诠释* b; b=&m; cout
  • 要使用printf 打印指针,您应该使用"%p" 格式和void * 类型。
  • 你想要pmc.PageFaultCount的地址吗?如果是这样,请使用jk = &amp;pmc.PageFaultCount;
  • *jk=pmc.PageFaultCount; 这个错误因为jk 未初始化。
  • printf 不打印地址,它以十六进制打印整数 pmc.PageFaultCount

标签: c++ c memory


【解决方案1】:

你从来没有分配过jk(可怕的名字)。您可以使用自动存储:

unsigned int jk=pmc.PageFaultCount;

或者你可以自己分配内存:

unsigned int *jk=new unsigned int;             // or malloc for C
*jk=pmc.PageFaultCount;


// and sometime later
delete jk;                                     // or free in C

附带说明,不要将 C 与 C++ 混淆。它们是两种不同的语言。

【讨论】:

  • 为什么要动态分配整数??
  • 别问我,这是他的恋物癖!
【解决方案2】:

当你声明变量jk

unsigned int *jk;

你没有初始化它,所以它的值是indeterminate

那么当你在下一行dereference指针时,你就有了undefined behavior

分配给jk 时不应取消引用它。

如果pmc.PageFaultCount本身不是指针,则需要使用地址运算符&amp;来获取指向它的指针。


但是,如果您想打印指向pmc.PageFaultCount 的指针,则不需要临时变量来存储它,只需打印即可:

std::cout << "Pointer to PageFaultCount = " << static_cast<void*>(&pmc.PageFaultCount) << '\n';

【讨论】:

    【解决方案3】:

    是什么让你认为这是一个指针? PROCESS_MEMORY_COUNTERS 包含计数,而不是地址。

    像这样使用它:

    std::cout << "Page fault count: " << pmc.PageFaultCount << std::endl;
    

    【讨论】:

    • 它包含内存地址,这些地址必须有一些值
    • @ArsalanSherwani 该结构包含DWORDs 和SIZE_Ts,而不是地址。 See the documentation.
    • 但它们确实有一些值,存储在它们上面。我想要那些价值观
    • 我不明白。当您执行std::cout &lt;&lt; pmc.PageFaultCount 时,它会显示页面错误计数。这不是你需要的吗?
    • 是的,现在我明白了,这些值以字节为单位。使用 cout 会将它们打印为 int 值。
    【解决方案4】:

    我不知道C++C#,但如果是c

    unsigned int *jk;
    *jk=pmc.PageFaultCount;
    

    将给出段错误,因为jk 在此处未初始化。

    相反,你可以这样做

    unsigned int *jk = malloc(sizeof(int));
    *jk=pmc.PageFaultCount;
    

    【讨论】:

    • 为什么要 malloc 一个整数??
    • @NeilKirk 告诉 OP 到底哪里出了错。
    【解决方案5】:

    问题似乎与格式说明符有关:

    printf( "\tPeakPagefileUsage: 0x%08X\n", pmc.PeakPagefileUsage );
    

    尝试使用

    printf( "\tPeakPagefileUsage: 0x%08d\n", pmc.PeakPagefileUsage );
    

    第一个是以十六进制(base-16)格式打印,但您可能希望以十进制(base-10)格式打印。

    编辑:或者更好地使用 %64d 来打印 64 位整数。

    【讨论】:

    • 或者使用C++作为标记,让编译器算出有多少位。
    • 对于日志记录、写入控制台、通过网络发送、printf 系列函数仍然是更好的选择!
    • printf("\n 页面错误计数 : %d", pmc.WorkingSetSize); cout
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 2015-04-02
    • 2021-01-05
    相关资源
    最近更新 更多