一.內存四驅模型
不知我們是否有讀過 《深入理解 java 虛擬機》這本書,強烈推薦讀一下。在 java 中我們將運行時數據,分為五個區域分別是:程序計數器,java 虛擬機棧,本地方法棧,java 堆,方法區。
在 c/c++ 中我們將運行時數據,分為四個區域分別是:棧區,堆區,數據區,代碼區。我們詳細來介紹下:
- 棧區:由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。
- 堆區:一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由 OS 回收。
- 數據區:存放全局變量、靜態變量和常量字符串等等。 程序結束后由系統釋放。
- 存放函數體的二進制代碼。
二.模型案例詳解
有時會想就算知道了 c/c++ 的內存四驅模型,好像也沒啥作用,這東西背一下就好了,其實不然。我們來看一個實例:
char* getStr(){char buff[128];strcpy(buff,"12345");return buff;
}void main(){char* str = getStr();printf("%s",str);getchar();
}
復制代碼
請問上面這個會打印啥?接下來我們再來看個實例:
// 求數組的大小
int size(int arr[]){int size = sizeof(arr) / sizeof(int);return size;
}void main(){int arr[] = {1,2,3,4,5,6};// 求數組的大小int size = sizeof(arr) / sizeof(int);printf("size = %d\n",size);size = size(arr);printf("size = %d\n",size);getchar();
}
復制代碼
請問上面兩個 size 的值是多少?接下來我們再來看個實例:
char* getStr1(){char* str = "12345";return str;
}char* getStr2(){char* str = "12345";return str;
}void main(){char* str1 = getStr1();char* str2 = getStr2();printf("%d , %d",str1,str2);getchar();
}
復制代碼
請問上面 str1 和 str2 的地址值是否會一樣?相信只要我們真正的理解了 c/c++ 的內存四驅模型,那么這些問題就迎刃而解了,當然這些還只是第一步,關鍵還在于對指針的理解。
視頻地址:https://pan.baidu.com/s/1gMzvvfP8nFj9wJ6VZgSnkQ 視頻密碼:3ti3