畢業了,想留的人沒能留住,想要的生活也沒有如約而至,也就這樣了。。。
---- 網易雲熱評
在程式沒有執行前,有幾個記憶體分割區已經確定,雖然分割區確定,但是沒有載入記憶體,程式只有執行時才載入記憶體:
text(程式碼區):只讀,例如函數
data:初始化的數據,全域性變數,static變數,文字常數區
bss:沒有初始化的數據,全域性變數,static變數
stack:棧區,返回值,普通區域性變數,自動管理記憶體,先進後出的特點
heap:堆區,手動申請空間malloc(),手動釋放free(),程式結束自動回收
一、記憶體操作
1、memset,將一個數組的記憶體區域前n個成員用字元填充,主要用來重新初始化數據
#include <stdio.h>
#include <string.h>
int main() {
int a[100];
for (int i=0;i<10;i++)
{
a[i] = i + 1;
}
printf("%d\n",a[1]);
//將a的前sizeof(a)個元素,用0填充
memset(a, 0, sizeof(a));
printf("%d\n", a[1]);
system("pause");
return 0;
}
2、memcpy,全拷貝,不管中間是否有結束符,memmove,如果記憶體重疊,用這個拷貝
#include <stdio.h>
#include <string.h>
int main() {
char p[]="aiyou\0bucuo";
char buf[100];
int a = sizeof(p);
printf("字串長度:%d\n", a);
strncpy_s(buf, 100, p,a);
printf("buf1=%s\n", buf);
printf("buf2=%s\n", buf + strlen("aiyou") + 1);
//將buf初始化,用0填充
memset(buf, 0, sizeof(buf));
//拷貝,將p的內容拷貝到buf中,大小爲a
memcpy(buf,p,a);
printf("buf3=%s\n", buf);
printf("buf4=%s\n", buf + strlen("aiyou") + 1);
system("pause");
return 0;
}
執行結果:
3、memcmp,比較數據是否相等
#include <stdio.h>
#include <string.h>
int main() {
char a[] = "abc";
char b[] = "abd";
char c[] = "abc";
printf("對比結果爲:%d\r\n", memcmp(a,b ,sizeof(a)));
printf("對比結果爲:%d\r\n", memcmp(b, a, sizeof(a)));
printf("對比結果爲:%d\r\n", memcmp(a, c,sizeof(a)));
system("pause");
return 0;
system("pause");
return 0;
}
執行結果:
二、堆疊操作
1、指向棧的指針
int *p;
int a=0;
p=&a;
*p=111;
2、指向堆指針,參數指定堆區分配多大空間
int *p
//手動申請堆空間
p=(int *)malloc(sizeof(int));
*p=111;
.....
//手動釋放堆空間
free(p);
歡迎關注公衆號:順便編點程