C程序的内存分配
轉自http://blog.csdn.net/iloveyaoge/article/details/6038716
C中內存分配有三種方式
【1】靜態存儲區分配。內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變量、static靜態變量。
【2】在棧上創建。在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動釋放。
【3】從堆上分配。也稱動態內存分配,在程序運行時用malloc或new申請任意多少的內存,程序員自己負責在何時用free或delete釋放。生存期由程序員決定。
在進行C/C++編程時,經常需要操作的內存可分為以下5個類別。
1:棧區(stack):由編譯器自動分配和釋放,存放函數的參數值、局部變量的值等。
2:堆區(heap):由程序員分配和釋放,若程序員不釋放,程序結束時可能由操作系統回收。
3:全局區(靜態區)(static):存放全局變量、靜態變量和常量。全局變量和靜態變量的存儲在一起的。程序結束后由系統釋放。
4:文字常量區:常量字符串就是放在這里,程序結束后由系統釋放。(文字常量區就是數據全局區?)
5:程序代碼區:存放函數體的二進制代碼。
參考參考《程序員面試寶典》p68一個題目。
char *strA()
{
?char str[ ]="hello world";
?return str;
}
首先要搞清楚char str[ ]="hello world"和char *str="hello world"這兩者的區別。書上說char str[ ]="hello world"分配的是一個局部數組;char *str="hello world"分配的是一個全局數組,可以再深入闡釋一下:
char *str="hello world" ,函數的局部變量只占了4個字節,因為它只聲明了一個指針,該指針存于棧區,而"hello world"字符串內容是存放于文字常量區的,指針str就指向了這個常量區。比如"hello world"被編譯器分配到0x2000到0x2011這段長度為12的內存區里,那么char *str="hello world" 語句運行時就相當于 char *str=0x2000。
char str[ ]="hello world",函數的局部變量分配了12個字節,該語句相當于char str[10]={104,101,108,108,111,32,87,119,111,114,108,100};字符串的內容時直接放在函數用的內存里邊。
回到之前的題目,可知str里存在的地址是函數strA棧幀里"hello world"的首地址,但是在函數調用完成,棧區自動釋放,棧幀回到調用strA之前的狀態,return str無法得知當前棧區狀態,所以程序無法輸出正確結果。
可修改如下:
const char *strA()//定義為const型,限定變量不允許被改變。
{
?char *str="hello world";
?return str;
}
或者
const char *strA()
{
?static?char str[ ]="hello world";? //str被定義為static,函數結束之后不釋放,保留當前棧區狀態。
?return str;
}
//===============================================
我自己加了一個例子,經典例子
#include <stdio.h>
int main (void)
{
?char str1[] = "abc";
?char str2[] = "abc";
?const char str3[] = "abc";
?const char str4[] = "abc";
?const char *str5 = "abc";
?const char *str6 = "abc";
?char *str7 = "abc";//雖然沒寫const,但其實和5,6是一樣的
?char *str8 = "abc";
?printf("%d/n",( str1 == str2 ));
?printf("%d/n",( str3 == str4 ));
?printf("%d/n",( str5 == str6 ));
?printf("%d/n",( str7 == str8 ));
?printf("%d/n",( str5 == str8 ));
?printf("%s/n",str5);
?str7[1]='X';? //想換成aXc,沒門!abc存在字符常量區,是常量,不可更改
?printf("%s/n",str5);
?return 0;
}
轉載于:https://blog.51cto.com/sourberry/646551
總結
- 上一篇: 实况足球19a和19b有什么区别 《实况
- 下一篇: 得间小说怎么关闭广告