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對應的十進制也是負數。