C語言記憶體及堆疊操作

2020-08-11 20:35:25

畢業了,想留的人沒能留住,想要的生活也沒有如約而至,也就這樣了。。。

----  網易雲熱評

 

在程式沒有執行前,有幾個記憶體分割區已經確定,雖然分割區確定,但是沒有載入記憶體,程式只有執行時才載入記憶體:

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);

 

歡迎關注公衆號:順便編點程