我提前为这个问题的愚蠢道歉。但我无法找到理解这一结果的方法。我试图找出指针在C ++中的真正含义。以下是以不同方式打印地址的简单代码。
int a = 15000;
char *b = reinterpret_cast<char*>(a); //equivalent of char *b = (char *)a
int *m = &a;
//(1)
printf("&a:%p\n",&a); //0x7fff5fbff878
printf("&*m:%p\n",&*m); //0x7fff5fbff878
printf("m:%p\n",m); //0x7fff5fbff878
//(2)
printf("a:%p\n",(int*)a); //0x3a98
printf("&*b:%p\n",&*b); //0x3a98
printf("b:%p\n",b); //0x3a98
printf("*m:%p\n",(int*)*m); //0x3a98
printf("&b:%p\n",&b); //0x7fff5fbff870
printf("&m:%p\n",&m); //0x7fff5fbff868
//(3)
std::cout << "b:" << b << std::endl; //error: Segmentation fault: 11
所以问题是
答案 0 :(得分:3)
为什么(1)和(2)的地址不同
因为在第一个示例(1)中,您使用运算符的&
地址,它为您提供存储“a”变量的地址,例如0x50302040
。
但是第二个例子(2),你使用地址(0x50302040
)指向的值,返回15000,等于十六进制的0x3a98。
将int转换为char *
时发生了什么
如果int
的值为15000,则现在char*
指向地址15000
,这显然是错误的。
为什么在'printf(“b:%p \ n”,b)'工作时出现错误(3)。
因为你的指针是一个char*
指针,所以使用了字符序列重载(ostream& operator<< (ostream& os, const char* s);
,因为你的指针没有指向一个字符序列(事实上) ,它没有指向任何东西,因为你为它分配了一个无效的值),你的程序崩溃了。
Theres ostream& operator<< (void* val);
重载只会打印指针的地址,但您需要显式地将char*
指针强制转换为void*
指针才能使用它:
std::cout << "b:" << (void*)b << std::endl; // Prints 0x3a98 (15000)