我有一个赋值,它应该在C / C ++中评估一些指针操作表达式和内存泄漏情况。我遇到了一个问题:
unsigned int* pInt = (unsigned int*) 0x403004;
对我来说这很可疑,但是在作业中,这条线在理论上是有效的,但运行程序我在这一行得到了段错误。
问题是:这是对的,甚至是可能的,还是教授只是愚弄我们说这是对的?我已经看到了一些带有字符串" hex"的例子和问题。 to int,但没有关于"纯十六进制" to int或int *
答案 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;
}