A. 怎样使用c语言程序获取Linux系统中未使用的内存大小
可以通过调用系统命令free。
获取free命令的输出值。
比如 system("free > tmp.txt");
然后fopen打开tmp.txt 获取输出,然后处理free的结果得到未使用内存大小。
也可以直接打开/proc/meminfo
第二行MemFree后面的数字就是free内存大小。
第二种更常用一些。
B. C语言,如何实现搜索内存数据
一般的讲,内存里边虽然说有*G的空间,但有些地方只是挂名存在,实际上是不存在的,所以访问了就会出错,所以就要判断内存是不是为有效地址,
就要用到VirtualQuery获取指定内存属性, 根据属性来判断能不能进行读取,
如果能读取就从调用VirtualQuery中得到的内存信息minfo中获取当前内存地址的有效区域的大小,然后再进行读取. 你可以用VC调试来看看,不能访问的内存就用?号来表示.由于搜所内存是一种运算量庞大的工作,所以,在对比处理要作速度优化处理. 如果数据大于4字节,请用 long 的数据格式来作对比运算, long 是 char 的处理速度的三倍以上,(个人测试的) 用long处理前端数据,再用 char 作收尾工作. 这是对比处理了.流程就有以下:
判断地址的有效性->定好搜所范围->进行对比->输出结果.
StartAdd 开始地址
EndAdd 结束地址
Data 查找的数据
DataSize 数据大小
void *FindMemory(DWORD StartAdd,DWORD EndAdd,void *Data,DWORD DataSize)
{
MEMORY_BASIC_INFORMATION minfo;
DWORD rt;
while(StartAdd<EndAdd)
{
::VirtualQuery((void*)StartAdd,&minfo,sizeof(MEMORY_BASIC_INFORMATION));
if(minfo.AllocationProtect)
if(minfo.State==MEM_COMMIT||minfo.State==MEM_FREE)
{
char *s=(char*)StartAdd,*e=s+minfo.RegionSize;
for(;s<e&&s+DataSize<=e;s++)
if(memcmp(s,Data,DataSize)==0)
return s;
}
StartAdd=(DWORD)minfo.BaseAddress+minfo.RegionSize;
}
return 0;
}
C. c语言内存读取问题,取反
将读到的数(FFFFFFFFFFFFFF81)&0xFF并用无符号类型输出。比如C用printf("%x\n",0xFFFFFFFFFFFFFF81&0xFF);就可以得到81,若用printf("%u\n",0xFFFFFFFFFFFFFF81&0xFF);,则输出是十进制129。
D. 求C语言内存数据读取代码
#include<stdlib.h>
#include<string.h>
int mem(void*souceptr,void*destptr,int infolen)
{
return memcpy(destptr,souceptr,infolen);// 复制源去目标地址,位数为Infolen
}
E. C语言如何申请内存
1.calloc
=
2malloc
+
memset
3与4是连续的,但是他们方式不一样,3你是通过new出来的和malloc一样,它申请的堆中的内存,需要手动释放。而4char
t[10]如果你是在函数里用到就是在栈里申请的,出函数会自动释放,如果是在文件开头的全局变量那就是在静态存储区
就这点区别
F. 在C语言中如果已经知道了一个数据的内存地址,怎样直接从内存中读取出该数据
#include<stdio.h>
int main()
{
int a=123,b=1234567;
int *m,*n;
m=&a;
n=&b;
printf("*m=%d\t,*n=%d\n",*m,*n);//打印指针指向的值
printf("m=%d\t,n=%d\n",m,n);//打印指针内存地址对应的十进制数,因为过大,会显示为一个 负数
printf("m=%p\t,n=%p\n",m,n);//打印指针类型的数据,即指针本身的地址
getch();
return 0;
}
输出的结果是:
*m=123 ,*n=-10617
m=-54 ,n=-52
m=FFCA ,n=FFCC
可以看到,b的值已经不是1234567,因为定义的b是个2个字节的,最大是65536,再大的数就会溢出,然后显示为负数的,同理,FFCA,FFCC也是过大,所以,m,n对应的十进制也是负数。