c基礎(4) 內存模型與操作

1.靜態變量 

      1.在程序執行只會被初始化一次 ,但是可以被多次賦值      2.在另外的文件中不能使用 ,static修飾的變量只能在本文件中使用

      3.未初始化的 靜態變量與全局變量 初始值爲0                                      4.

#include<stdio.h>
#include<Windows.h>

extern int b=10;
void func(){
    static int a=10;
    printf("%d \n",a++);       10 11 12 13 14 15 16 17 18 19 
}
void main(void) {
    for (int i = 0; i < 10; ++i) {
        func();
    }
    return;   }

  3.使用  extern 聲明,然後可以使用一個項目中的文件的變量(static除外)或者函數,

2.內存四塊模型

 3.malloc  開闢堆內存

void main(void) {
    char *p = malloc(sizeof(char)*10);   創建10個大小的堆內存
 
    strcpy(p,"hello world");
    char *p1 = "hello world";
    char *p2 = "hello world";
    printf("%p \n",p);     0000000002A01400
    printf("%p \n",p1);    0000000000404000
    printf("%p \n",p2);    0000000000404000
        free(p);
    return;
}

  1.p1  和  p2都是字符常量區的字符串,所以地址一樣的,   p是  malloc 函數 創建10個char類型大小的堆內存再拷貝的內存不一樣

   2. memset(p,0,10);  使用memest重置一塊內存的值   參數:  目標 , 重置的值, 重置大小   上面是  1*10個         值最好是0

2.memest

  可以重置棧空間中的數組值, 大小爲4 *5=20 

     int arr[] = {1,2,3,4,5};
    memset(arr,0,20);

    for (int i = 0; i < 5; ++i) {
        printf("%d \n",arr[i]);   0 0 0 0 0
    }

3.memcpy, memove

   1.拷貝 一個內存中的值到另一個內存中去, 拷貝5個int類型的大小   ,拷貝重複的內存地址會報錯,  而memove不會報錯

   2.memcpy拷貝結束標誌是看 個數,  而strcpy拷貝結束是以字符串 \0爲結尾

  int arr[] = {1,2,3,4,5};
    int *p = malloc(sizeof(int)*5);
    memcpy(p,arr,20);

    for (int i = 0; i < 5; ++i) {
        printf("%d \n",p[i]);   1,2,3,4,5
    }

4.memcmp

   比較兩個內存中的值.可以指定個數比較.   相同返回0   不同返回-1

    int arr[] = {1,2,3,4,5};
    int arr2[] = {1,2,3,4,5};
    int a =memcmp(arr,arr2,5);  0

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章