读书人

VC++ 内存储器的读写

发布时间: 2013-08-04 18:26:16 作者: rapoo

VC++ 内存的读写
如何直接对内存进行读写?


int*p=(int*)malloc(sizeof(int)*4);
ZeroMemory(p, sizeof(int)*4);
//int *p=NULL;
*p=123;
char buf[30];
_snprintf(buf,29,"%d",p);buf[29]=0;
for(int i=0;i<4;i++)
{
memcpy((int*)p+i,p,sizeof(int)*4);

}
static char buf1[30];
_snprintf(buf1,29,"%d",p);buf1[29]=0;
free(p)

buf 应该是123;
buf1 应该是123123123123123;
但实际上buf 566294,buf1 是0000000

跪求错在哪里?

[解决办法]
引用:
Quote: 引用:

第一个问题,读取指针数据要解参考,所以要用_snprintf(buf,29,"%d",*p);
然后memcpy时源数据和目标地址都是int型,大小就是sizeof(int);
对于buf1,最初申请内存是动态申请的,内存不一定连续,即时内存连续,也无法都按int一次性读出,而*p只会将第一位的数据读出,想全部按照int格式读出就要多写几个%d,_snprintf(buf1,29,"%d%d%d",*p,*(p+1),*(p+2));

问题一:int*p=(int*)malloc(sizeof(int)*4); 您的意思是 这样申请的内存不是保证能连续的吗?有没有办法保证其内存都是连续的?
问题二:怎样读取内存数据,将buf1 转化为int[]?
谢谢!!! 大侠

抱歉,是我弄错了,malloc申请的内存逻辑上是连续的
[解决办法]
引用:
第一个问题,读取指针数据要解参考,所以要用_snprintf(buf,29,"%d",*p);
然后memcpy时源数据和目标地址都是int型,大小就是sizeof(int);
对于buf1,最初申请内存是动态申请的,内存不一定连续,即时内存连续,也无法都按int一次性读出,而*p只会将第一位的数据读出,想全部按照int格式读出就要多写几个%d,_snprintf(buf1,29,"%d%d%d",*p,*(p+1),*(p+2));
的确,将你的代码修改了,达到你预期的效果。
#include <iostream>
using namespace std;
int main()
{
int*p=(int*)malloc(sizeof(int)*4);
memset(p, 0, sizeof(int) * 4);
*p=123;
char buf[30];
_snprintf(buf,29,"%d",*p);
cout<<buf<<endl;
for(int i=0;i<4;i++)
{
memcpy(p+i,p,sizeof(int));
}
static char buf1[30];
_snprintf(buf1,29,"%d%d%d%d",*p, *(p+1), *(p+2), *(p+3));


cout<<buf1<<endl;
free(p) ;
system("pause");
return 0;
}

读书人网 >C++

热点推荐