读书人

内存有关问题求解

发布时间: 2012-03-03 15:33:04 作者: rapoo

内存问题,求解
#include <stdio.h> 4。在对齐为4的情况下
struct BBB
{
long num;
char *name;
short int data;
char ha;
short ba[5];
}*p;
p=0x1000000; //这句是什么意思?是说BBB的start地址是1000000么?
p+0x200=__?__;
(Ulong)p+0x200=__?__; //这个(Ulong)是unsigned long么?这样算对p的类型重新定义么
(char*)p+0x200=__?__;


[解决办法]
1. p=0x1000000;
p是指向BBB的指针,这里只不过给p赋了一个值0x10000000,表示p指向这个地方。

2. p+0x200=__?__;
等于0x10000000 + 0x200 * sizeof(BBB),由于p是BBB的指针类型,所以p是以BBB的尺寸作为一个单元来移动的

3. (Ulong)p+0x200=__?__;
等于0x10000000 + 0x200*sizeof(Ulong),将p强行解释为Ulong类型,所以p是以Ulong的尺寸作为一个单元来移动。

4. (char*)p+0x200=__?__;
等于0x10000000 + 0x200*sizeof(char*),同上,将p强行解释为char*类型,但注意是char*而不是char,cha*是指针,占四个字节,而char占一个字节
[解决办法]
int main()
{
int *p;
p = (int *)0x1000000; //类型不匹配,而且或许它不允许你在这两个类型之间作隐式转换,可以强制转换
cout < < (p + 0x200) < < endl;
cout < < ((unsigned long)p + 0x200) < <endl;
cout < < (void *)((char*)p + 0x200) < <endl; //cout遇到一个char *会输出字符串而不是指针指,而这块内存,你可能没有读的权限,强制转换为其他指针类型就可以
}
[解决办法]
16777728 / 0x1000200是16进制的 这个市十进制 一样的
[解决办法]
默认的输出整数 是以10为基的 可以这样改下:
包含头文件:#include <iomanip>

在 cout < < ((unsigned long)p + 0x200) < <endl; 前面加上 cout < <setbase(16);

//用完后最好在后面加上 cout < <setbase(10);
[解决办法]
数值默认是十进制的,其他两个是指针值所以是按照16进制输出的

读书人网 >C++

热点推荐