在c ++中从十六进制转换为unsigned int *

时间:2016-10-07 23:05:38

标签: c++ pointers memory-leaks segmentation-fault

我有一个赋值,它应该在C / C ++中评估一些指针操作表达式和内存泄漏情况。我遇到了一个问题:

unsigned int* pInt = (unsigned int*) 0x403004;

对我来说这很可疑,但是在作业中,这条线在理论上是有效的,但运行程序我在这一行得到了段错误。

问题是:这是对的,甚至是可能的,还是教授只是愚弄我们说这是对的?我已经看到了一些带有字符串" hex"的例子和问题。 to int,但没有关于"纯十六进制" to int或int *

3 个答案:

答案 0 :(得分:3)

unsigned int* pInt = (unsigned int*) 0x403004;

这里有两件事可疑:

  • 除非您正在编写一些专用软件,如设备驱动程序或操作系统,或者您处于固定内存的某些嵌入式或特殊系统中,因此查看硬编码的内存地址肯定是可疑的。如果您的程序试图访问它没有访问权限的内存,那么它(最好)会失败。

  • 在右侧,编译器首先推导出0x403004中的值int,并将其正确转换为指针。因此,您的Segfault可能是第一点的结果。

答案 1 :(得分:3)

unsigned int * pInt =(unsigned int *)0x403004;

可能吗?:是(编译,构建得很好)

是不是?:取决于为什么。显然,它对于课堂作业中的插图很有用。

是否推荐?没有。它将调用 undefined behavior 。您正在创建一个变量,该变量指向您可能拥有或可能没有权限的内存中的位置。如果你从不使用它,那很好。但如果你使用它,结果是不确定的。

答案 2 :(得分:2)

只有当该数字代表已经分配的内存时才能正常工作 例如:

#include <iostream>

int main()
{
    int i = 7;
    std::cout << "i: " << i << std::endl; // 7
    std::cout << "&i: " << &i << std::endl; // in my case: 0018FF44
    unsigned int* ptr = (unsigned int*)0x0018FF44; // it's ok

    /*
    this is just for explaining because the address of i may differ at anytime the program
    launches thus 0018FF44 will no longer be assigned to i and consequently segfault.

    the right thing is to make pointer points always to whatever i may take as an address.
    to do so:
    */

    //int* ptr = (unsigned int*)&i; // not i but the address of i     

    (*ptr)++;

    std::cout << i << std::endl; // 8
    // above we changed i through pointer ptr

    int* pRandom = (int*)0xAB2FC0DE0; // this causes me segfault
    *pRandom = 5; // segfault

    std::cout << "*pRandom: " << *pRandom << std::endl; // segfault

    std::cout << std::endl;
    return 0;
}